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
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/: insertaHEADtexto en la primera línea al principio de la línea -
$s/$/TAIL/– agregaTAILtexto 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 (*) confooextensión, use**/*.foopara la recursividad (después de habilitar globstar:shopt -s globstar)
Comentarios
- nota que bufdo no es POSIX pubs.opengroup.org/onlinepubs/9699919799/utilities/ex.html
- @StevenPenny tiene razón. Yo uso las funciones especificadas de POSIX solamente, personalmente, para las ediciones con guiones.
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
-ien lugar de que esta sustitución de archivos no funcione, simplemente se imprime en la salida estándar.