GNU/Linux >> LINUX-Kenntnisse >  >> FreeBSD

Freebsd – Bsd Sed:Nur das N-te Vorkommen eines Musters ersetzen?

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 jedes N ext-Zeile zum Musterbereich, indem s ausgeführt wird ubstitute-Befehl für 2 Nur das 1. Auftreten. Wir t est, ob die Substitution erfolgreich war oder nicht. Wenn ja, laufen wir in die Schleife :2 , andernfalls wiederholen Sie die Schleife mit b1 .

  • 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.


FreeBSD
  1. Verwenden von Sed zum Suchen und Ersetzen einer Linie zwischen Musterbereichen

  2. Wie ersetze ich eine Zeichenfolge in einer oder mehreren Dateien?

  3. Gibt nur die übereinstimmende Zeichenfolge in Sed zurück?

  4. Finden Sie die Zeilennummer, die das Muster enthält, mit benutzerdefiniertem Regex-Trennzeichen?

  5. Muster ersetzen, nachdem N-te Übereinstimmung in jeder Zeile gefunden wurde??

Top 20 der zu verwendenden sed-Befehle

Wie finde ich das letzte Auftreten eines Musters und drucke alle Zeilen nach dem letzten Auftreten?

Freebsd – Woher kommt Mac Os X?

Nur das erste Vorkommen nur mit Grep finden?

ersetzt das n-te Vorkommen von String in jeder Zeile einer Textdatei

Verwenden von sed zum Ersetzen zwischen einem bestimmten Muster