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 jedesN
ext-Zeile zum Musterbereich, indems
ausgeführt wird ubstitute-Befehl für2
Nur das 1. Auftreten. Wirt
est, 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.