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/
: insertaHEAD
texto en la primera línea al principio de la línea -
$s/$/TAIL/
– agregaTAIL
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 (*
) confoo
extensión, use**/*.foo
para 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
-i
en lugar de que esta sustitución de archivos no funcione, simplemente se imprime en la salida estándar.