¿Cómo agrego texto al principio y al final de varios archivos de texto en Bash?

Tengo un directorio lleno de archivos de texto. Mi objetivo es agregar texto al principio y al final de todos ellos. El texto que va al principio y al final es el mismo para cada archivo.

Basado en el código que obtuve de la web, este es el código para agregar al principio del archivo:

echo -e "var language = {\n$(cat $BASEDIR/Translations/Javascript/*.txt)" > $BASEDIR/Translations/Javascript/*.txt 

Este es el código para agregar al final del archivo. El objetivo es agregar el texto }; al final de cada archivo:

echo "};" >> $BASEDIR/Translations/Javascript/*.txt 

Los ejemplos que extraje fueron para actuar en archivos individuales. Pensé en intentar actuar en varios archivos usando el comodín, *.txt.

También podría estar cometiendo otros errores. En cualquier caso, ¿cómo puedo agregar texto al principio y al final de varios archivos?

Respuesta

Para agregar texto a un archivo, puede usar (con el Implementación GNU de sed):

sed -i "1i some string" file 

Agregar texto es tan simple como

echo "Some other string" >> file 

Lo último que debe hacer es poner eso en un bucle que recorra todos los archivos que desea editar:

for file in *.txt; do sed -i "1i Some string" "$file" && echo "Some other string" >> "$file" done 

Respuesta

Puede usar GNU sed

Como ya se ilustra, puede insertar líneas de texto justo antes y después de la coincidencia líneas de un archivo con sed, utilizando el comando i y a respectivamente. «Se ha demostrado que puedes hacerlo con una sola línea y por varios archivos a la vez.

Lo siguiente insertará una línea antes del primer 1i y después de la última línea $a. Las inserciones se ejecutarán para todos los archivos que coincidan con el glob *.txt.

sed -i -e "1ivar language = {" -e "$a};" -- *.txt 

Ambos i y a no solo funcionan con números de línea, sino también en cada línea que coincide con un patrón dado. Esto insertaría un comentario siempre que una línea contenga var y = 2;:

sed -i -- "/var y = 2;/i//initialize variable y" *.js 

Respuesta

Comando totalmente compatible con POSIX, utilizando ex :

for f in *.txt; do printf "%s\n" 0a "var language = {" . "$a" "};" . x | ex "$f"; done 

Si ejecuta la parte printf del comando por sí mismo, verá los comandos de edición exactos que pasa a ex:

0a var language = { . $a }; . x 

0a significa «Adjuntar texto después de la línea 0 «(en otras palabras, antes de la primera línea). La siguiente línea es el texto literal para «agregar» después de la línea 0. El punto (.) en una línea por sí solo termina el texto que se agregará.

$a significa agregar texto después de la última línea del archivo.

x significa guardar los cambios y salir .

Respuesta

Aquí «una forma de hacerlo en Perl:

for f in ./*txt; do perl -lpe "BEGIN{print "First string"}END{print "Last string"}" "$f" > foo && mv foo "$f"; done 

Comentarios

  • @St é phaneChazelas agregando -i en lugar de que esta sustitución de archivos no funcione, simplemente se imprime en la salida estándar.
  • @OlehPrypin, de hecho es su derecho. Comentario eliminado.

Respuesta

También tiene derecho a ser (con resultados en .out archivos):

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.out" \; 

Otra variante más elaborada: los archivos fuente reemplazados por el resultado:

find . -name "*.txt" -exec sh -c "(echo HEAD;cat {};echo FOOT) > {}.tmp && mv {}.tmp {}" \; -print 

Responder

Intente usar ex:

ex -s +"bufdo!1s/^/HEAD/|$s/$/TAIL/" -cxa *.foo 

donde los comandos son:

  • bufdo! ejecuta los siguientes comandos para cada búfer / archivo abierto (nota: «no es POSIX )
  • 1s/^/HEAD/: inserta HEAD texto en la primera línea al principio de la línea
  • $s/$/TAIL/ – agrega TAIL texto en la última línea al final de la línea

y los argumentos son:

  • -s – modo silencioso / rápido
  • -cxa – guarde todos los búferes / archivos abiertos y salga
  • *.foo – todos los archivos en el directorio actual (*) con foo extensión, use **/*.foo para la recursividad (después de habilitar globstar: shopt -s globstar)

Comentarios

Responda

Con gnu awk, usando el inplace extensión y BEGINFILE / ENDFILE:

gawk -i inplace "BEGINFILE{print "INSERT"};ENDFILE{print "APPEND"};1" ./*.txt 

Respuesta

Perl one-liner al rescate:

perl -i -pe"$_="FIRST LINE\n$_"if$.<2;$.=0,$_.="LAST LINE\n"if eof" *.txt 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *