sed: aplica cambios en varios archivos

11

Tengo cientos de archivos que contienen " </foo:bar>"

cc
bb
aa
</foo:bar>
dd
xx
vv

Quiero cambiarlos todos a la vez para

cc
bb
aa
</foo:bar>

sed funciona bien cuando le doy el nombre exacto del archivo

sed -i "/ </ foo: bar> / q" 99999.txt

pero cuando trato de cambiarlos todos a la vez no obtengo ningún resultado.

 sed -i "/<\/foo:bar>/q" *.txt
Shervan
fuente

Respuestas:

19

Tratar:

sed -s -n -i '0,/<\/foo:bar>/p' *.txt

-s le dice a sed que trate cada archivo como separado.

Como no queremos sedsalir hasta que todos los archivos estén terminados, cambiamos para imprimir solo desde el principio <\/foo:bar>y no imprimir el resto de las líneas. -nle dice a sed que no se imprima a menos que se lo solicitemos explícitamente. El comando 0,/<\/foo:bar>/ple dice a sed que imprima cualquier línea en el rango desde el comienzo del archivo hasta la primera línea que coincida <\/foo:bar>.

La -sopción no está disponible para BSD / OSX sed.

John1024
fuente
@ fd0 Gracias. Respuesta actualizada para notar la falta de -sBSD / OSX sed.
John1024
para GNU sed , la -iopción implica -s... ¿hay una sedimplementación en la que esta solución no funcione sin la -sopción?
Sundeep
7

Para dejar de leer los archivos cuando </foo:bar>se encuentra:

Con GNU awk:

gawk -i inplace '{print}; $0 == "</foo:bar>" {nextfile}' ./*.txt

Con perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
Stéphane Chazelas
fuente