Mit BSD sed;
Wie kann ich die folgende Substitution durchführen?:
Vorher:
hello hello hello
hello hello hello Nachher:
hello world hello
hello hello hello
Mit anderen Worten; wie kann ich nur the ersetzen N th Vorkommen eines Musters?
(Oder in diesem Fall:der 2 nd Vorkommen eines Musters?)
Akzeptierte Antwort:
Mit jedem POSIX sed :
$ sed -e'/hello/{' -e:1 -e'$!N;s/hello/world/2;t2' -eb1 -e\} -e:2 -en\;b2 <file
hello world hello
hello hello hello
-
Nach der ersten Übereinstimmung
/hello/, geraten wir in eine Schleife. -
Innerhalb der Schleife
:1, lesen wir jedesNext-Zeile zum Musterbereich, indemsausgeführt wird ubstitute-Befehl für2Nur das 1. Auftreten. Wirtest, ob die Substitution erfolgreich war oder nicht. Wenn ja, laufen wir in die Schleife:2, andernfalls wiederholen Sie die Schleife mitb1. -
Innerhalb der Schleife
:2, wir drucken nur verbleibende Zeilen bis zum Ende der Datei.
Beachten Sie, dass dieser Ansatz alle Dinge zwischen zwei hello speichert im Musterraum. Es wird ein Problem mit großen Dateien geben, wenn die erste und die zweite weit voneinander entfernt sind.