sed - Änderungen in mehreren Dateien anwenden

11

Ich habe Hunderte von Dateien, die " </foo:bar>" enthalten

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

Ich möchte sie alle auf einmal ändern

cc
bb
aa
</foo:bar>

sed funktioniert gut, wenn ich ihm den genauen Dateinamen gebe

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

aber wenn ich versuche, alle auf einmal zu ändern, bekomme ich kein Ergebnis.

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

Antworten:

19

Versuchen:

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

-s weist sed an, jede Datei als separat zu behandeln.

Da wir nicht sedbeenden möchten , bis alle Dateien fertig sind, drucken wir nur von Anfang an <\/foo:bar>und nicht den Rest der Zeilen. -nsagt sed nicht drucken, es sei denn, wir bitten ausdrücklich darum. Der Befehl 0,/<\/foo:bar>/pweist sed an, eine beliebige Zeile im Bereich vom Anfang der Datei bis zur ersten übereinstimmenden Zeile zu drucken <\/foo:bar>.

Die -sOption ist für BSD / OSX sed nicht verfügbar.

John1024
quelle
@ fd0 Danke. Antwort aktualisiert, um das Fehlen von -sBSD / OSX sed festzustellen .
John1024
für GNU sed , -iimpliziert Option -s... gibt es eine sedImplementierung , bei der diese Lösung wird nicht funktionieren ohne -sOption?
Sundeep
7

So beenden Sie das Lesen der Dateien, wenn sie </foo:bar>gefunden werden:

Mit GNU awk:

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

Mit perl:

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