sed - aplica alterações em vários arquivos


11

Eu tenho centenas de arquivos que contêm " </foo:bar>"

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

Eu quero mudá-los todos de uma vez para

cc
bb
aa
</foo:bar>

sed funciona bem quando eu dou o nome exato do arquivo

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

mas quando tento alterar todos eles de uma só vez, não recebo resultado.

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

Respostas:


19

Experimentar:

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

-s diz ao sed para tratar cada arquivo como separado.

Como não queremos sedsair até que todos os arquivos estejam concluídos, mudamos para apenas imprimir do começo para <\/foo:bar>e não para imprimir o restante das linhas. -ndiz ao sed para imprimir, a menos que solicitemos explicitamente. O comando 0,/<\/foo:bar>/pdiz ao sed para imprimir qualquer linha no intervalo, desde o início do arquivo até a primeira linha correspondente <\/foo:bar>.

A -sopção não está disponível para BSD / OSX sed.


@ fd0 Obrigado. Resposta atualizada para observar a falta de -sBSD / OSX sed.
precisa saber é o seguinte

para GNU sed , a -iopção implica -s... existe uma sedimplementação em que esta solução não funcione sem a -sopção?
Sundeep

7

Para parar de ler os arquivos quando </foo:bar>for encontrado:

Com o GNU awk:

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

Com perl:

perl -ni -e 'print; close ARGV if $_ eq "</foo:bar>\n"' ./*.txt
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.