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

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.


@ 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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.