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

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

Mit sed , wie würde man Text nach einem Zeichen einfügen, das vor (oder nach) einer Zeichenfolge durch N steht Vorkommnisse. Nehmen wir als Beispiel an, dass die zu bearbeitende Textzeile die folgende ist:

command -some -args -c 'a quoted section;some;lines;of code;keyword;more lines;etc();'

Nachdem Sie diese Zeile in einer Textdatei gefunden haben (vielleicht durch die eindeutige Zeichenfolge command ), möchte ich Text nach dem zweiten (N=2) Semikolon vor keyword einfügen (d. h. das Semikolon, das lines trennt und of ). Ich möchte speziell sed verwenden für den Zweck.

Wenn Sie mit diesem Beispiel fortfahren, wäre die erwartete Ausgabe:

command -some -args -c 'a quoted section;some;lines;INSERTED_STRING;of code;keyword;more lines;etc();'

wobei INSERTED_STRING; (sed bereitgestellt, z. B. über eine Shell-Variable) wurde an der gewünschten Position eingefügt.

Akzeptierte Antwort:

Ich bevorzuge es einfach:

sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'

um zwei Felder vor dem Schlüsselwort einzufügen. Die allgemeine Lösung wäre

sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"

Beachten Sie jedoch, dass das N hat im Vergleich zu Ihrer Frage ein Offnet von 1:Hier N=2 bedeutet zwei Felder zwischen der Einfügung und dem keyword zu haben .

Erklärung:/command/ wählt nur Zeilen mit command aus , sodass andere Zeilen unberührt bleiben. ([^;]*;\) stimmt mit einem Feld (einer Folge von Nicht-Semikolons) einschließlich des folgenden Semikolons überein. Indem Sie ihm \{$N\} folgen das Muster entspricht $N Felder. Das folgende keyword vervollständigt dies, um keyword abzugleichen und das $N Felder davor. Das Ersetzungsmuster besteht aus dem eingefügten String und & , die durch alles ersetzt wird, was abgeglichen wurde (also war es am Ende kein Ersatz, sondern eine Einfügung).

Gekürzt und besser lesbar mit erweiterten regulären Ausdrücken:

sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"

Linux
  1. Wie fügt man Text vor der ersten Zeile einer Datei ein?

  2. Wie lösche ich mehrere zufällige Zeilen aus einer Textdatei mit Sed?

  3. Erstes Zeichen einer Zeichenfolge mit Sed umbrechen?

  4. Verwenden Sie Sed, um ein Zeichen an der n-ten Position der übereinstimmenden Zeichenfolge hinzuzufügen?

  5. Finden Sie passenden Text und ersetzen Sie die nächste Zeile

Unix Sed Tutorial:Dateizeilen anhängen, einfügen, ersetzen und zählen

Einfügen mehrerer Zeilen in eine Datei nach einem bestimmten Muster mit Shell-Skript

sed - Zeile nach X Zeilen nach Übereinstimmung einfügen

Suchen und ersetzen Sie Text in einer Datei zwischen einem Zeilenbereich mit sed

Wie füge ich mit sed Text in die erste Zeile einer Datei ein?

Beenden Sie das Programm, nachdem es eine bestimmte Zeile aus einem Shell-Skript ausgegeben hat