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:
- Einführung eines Schleifenplatzhalters
:a
(hiera
ist ein willkürlicher Name). - Drucke die aktuelle Zeile und hole die nächste in den Musterbereich mit
n
Befehl. - Leiten Sie die Steuerung mit
ba
zurück Befehl, der im Wesentlichen eingoto
ist bisa
Platzhalter. Die End-of-File-Bedingung wird natürlich vonn
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.