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

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

Für diese Frage gibt es hier bereits Antworten :sed:lösche alle Vorkommen eines Strings außer dem ersten

(4 Antworten)
Vor 2 Jahren geschlossen.

Ich habe eine Datei mit Zeilen:

india;austria;japan;chile
china;US;nigeria;mexico;russia

Ich möchte alle Vorkommen von Semikolon in jeder Zeile durch z. ;NEW; , aber erst ab dem 2. Auftreten. Das Ergebnis sollte so aussehen:

india;austria;NEW;japan;NEW;chile
china;US;NEW;nigeria;NEW;mexico;NEW;russia

Ich habe das mit gsub versucht, aber es ersetzt alle Vorkommen:
awk '/;/{gsub(/;/,";NEW;") }{print}'

Akzeptierte Antwort:

Das awk Lösung ist viel länger, aber es ist einfacher, sie generisch zu machen:

awk -F; '{for(i=1;i<NF;i++)printf"%s;%s",$i,(i>=2)?"NEW;":"";print$NF}' replacefile

Möglich ist das mit sed auch, indem Sie eine Schleife mit dem t machen Befehl und ersetzen Sie immer das zweite (oder was auch immer Sie wollen) Trennzeichen durch eine temporäre Markierung (normalerweise n ):

sed ':b;s/;/n/2;tb;s/n/;NEW;/g' replacefile

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

  2. Vorherige Zeile nach einer Musterübereinstimmung mit Sed drucken?

  3. Nur den Teil einer Linie nach einem übereinstimmenden Muster zurückgeben?

  4. Sed:Nur das erste Auftreten einer Musterübereinstimmung drucken?

  5. Sed On Osx Insert an einer bestimmten Zeile?

Ersetzen von Zeichenfolgen in Bash

Mehrzeiliger Musterabgleich mit Sed, Awk oder Grep?

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

Sed:Text nach dem N-ten Zeichen vor/nach einer gegebenen Zeichenfolge einfügen?

Bash-Skript:Wie weist man jede Zeile der Befehlsausgabe Werten in einem Array zu?

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