sed - zastosuj zmiany w wielu plikach

11

Mam setki plików zawierających „ </foo:bar>

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

Chcę je wszystkie zmienić na raz

cc
bb
aa
</foo:bar>

sed działa dobrze, gdy podam mu dokładną nazwę pliku

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

ale kiedy próbuję zmienić je wszystkie naraz, nie mam rezultatu.

 sed -i "/<\/foo:bar>/q" *.txt
Shervan
źródło

Odpowiedzi:

19

Próbować:

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

-s każe sedowi traktować każdy plik jako osobny.

Ponieważ nie chcemy sedwychodzić, dopóki nie skończą się wszystkie pliki, zmieniamy, aby po prostu drukować od początku do, <\/foo:bar>a nie drukować resztę wierszy. -nmówi sed nie drukować, chyba że wyraźnie o to poprosimy. Polecenie 0,/<\/foo:bar>/pnakazuje sedowi wydrukowanie dowolnego wiersza w zakresie od początku pliku do pierwszego pasującego wiersza <\/foo:bar>.

Ta -sopcja nie jest dostępna dla sed BSD / OSX.

John1024
źródło
@ fd0 Dziękuję. Odpowiedź zaktualizowana w celu odnotowania braku -sBSD / OSX sed.
John1024
dla GNU sed , -iopcja zakłada -s... tam jest sedrealizacja gdzie takie rozwiązanie nie będzie działać bez -sopcji?
Sundeep,
7

Aby zatrzymać czytanie plików, gdy </foo:bar>zostanie znaleziony:

Z GNU awk:

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

Z perl:

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