sed - aplica mudanças em múltiplos arquivos

10

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

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

Eu quero mudar todos de uma vez para

cc
bb
aa
</foo:bar>

sed funciona bem quando eu forneço o nome exato do arquivo

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

mas quando eu tento mudar todos eles de uma só vez eu não tenho resultado.

 sed -i "/<\/foo:bar>/q" *.txt
    
por Shervan 13.09.2016 / 08:22

2 respostas

18

Tente:

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

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

Como não queremos que sed seja encerrado até que todos os arquivos estejam prontos, mudamos para apenas imprimir do início para <\/foo:bar> e não imprimir o resto das linhas. -n informa ao sed não ser impresso, a menos que seja explicitamente solicitado. O comando 0,/<\/foo:bar>/p informa ao sed para imprimir qualquer linha no intervalo desde o início do arquivo até a primeira linha que corresponda a <\/foo:bar> .

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

    
por 13.09.2016 / 08:27
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
    
por 13.09.2016 / 14:42