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

sed zum Einfügen nur bei der ersten Übereinstimmung

Sie können dies in GNU sed tun:

sed '0,/Matched Keyword/s//New Inserted Line\n&/'

Aber es ist nicht tragbar. Da die Portabilität gut ist, hier in awk:

awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile

Oder, wenn Sie eine Variable zum Drucken übergeben möchten:

awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile

Beide fügen die Textzeile vor ein das erste Vorkommen des Schlüsselworts, in einer eigenen Zeile, gemäß Ihrem Beispiel.

Denken Sie daran, dass sowohl bei sed als auch bei awk das übereinstimmende Schlüsselwort ein regulärer Ausdruck ist, nicht nur ein Schlüsselwort.

AKTUALISIERUNG:

Da diese Frage auch mit bash getaggt ist, ist hier eine einfache Lösung, die reine bash ist und kein sed erfordert:

#!/bin/bash

n=0
while read line; do
  if [[ "$line" =~ 'Matched Keyword' && $n = 0 ]]; then
    echo "New Inserted Line"
    n=1
  fi
  echo "$line"
done

So wie es aussieht, ist dies eine Pfeife. Sie können es einfach in etwas einpacken, das stattdessen auf Dateien wirkt.


Wenn Sie eine mit sed* wollen:

sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt

*funktioniert nur mit GNU sed


Das könnte für Sie funktionieren:

sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file

Sie haben es fast geschafft! Erstellen Sie einfach eine Schleife, um aus Matched Keyword zu lesen bis zum Ende der Datei.

Nach dem Einfügen einer Zeile kann der Rest der Datei ausgedruckt werden mit:

  1. Einführung eines Schleifenplatzhalters :a (hier a ist ein willkürlicher Name).
  2. Drucke die aktuelle Zeile und hole die nächste in den Musterbereich mit n Befehl.
  3. Leiten Sie die Steuerung mit ba zurück Befehl, der im Wesentlichen ein goto ist bis a Platzhalter. Die End-of-File-Bedingung wird natürlich von n erledigt Befehl, der alle weiteren sed-Befehle beendet, wenn er versucht, das Dateiende überschritten zu haben.

Mit ein wenig Hilfe von bash kann ein echter Einzeiler erreicht werden:

sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file

Alternative:

sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file

Dies verwendet den Matched Keyword als Flag im Haltebereich und sobald es gesetzt wurde, wird jede Verarbeitung durch sofortiges Aussteigen eingeschränkt.


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

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

  3. Konvertieren Sie die Zeichenfolge in der Befehlszeile in Hexadezimal

  4. unix - Anzahl der Spalten in der Datei

  5. Mehrzeilige Sed ersetzen

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

Vorherige Zeile nach einer Musterübereinstimmung mit Sed drucken?

Kann Sed Zeilenumbrüche ersetzen?

Sed On Osx Insert an einer bestimmten Zeile?

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

Wie kann man nur die erste Zeile von zwei Dateien unterscheiden?