Puoi fare questo in GNU sed:
sed '0,/Matched Keyword/s//New Inserted Line\n&/'
Ma non è portatile. Poiché la portabilità è buona, eccola in awk:
awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile
Oppure, se vuoi passare una variabile da stampare:
awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile
Entrambi inseriscono la riga di testo prima la prima occorrenza della parola chiave, su una riga a parte, secondo il tuo esempio.
Ricorda che sia con sed che con awk, la parola chiave corrispondente è un'espressione regolare, non solo una parola chiave.
AGGIORNAMENTO:
Poiché anche questa domanda è contrassegnata con bash, ecco una soluzione semplice che è pura bash e non richiede sed:
#!/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
Così com'è, questo come un tubo. Puoi facilmente racchiuderlo in qualcosa che agisce invece sui file.
Se ne vuoi uno con sed*:
sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt
*funziona solo con GNU sed
Questo potrebbe funzionare per te:
sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file
Ci sei quasi! Basta creare un loop per leggere dal Matched Keyword
alla fine del file.
Dopo aver inserito una riga, il resto del file può essere stampato con:
- Presentazione di un segnaposto ad anello
:a
(quia
è un nome arbitrario). - Stampa la riga corrente e carica la successiva nello spazio del pattern con il
n
comando. - Reindirizza il controllo indietro usando il
ba
comando che è essenzialmente ungoto
ala
segnaposto. La condizione di fine file è naturalmente curata daln
comando che termina qualsiasi ulteriore comando sed se tenta di leggere oltre la fine del file.
Con un piccolo aiuto da parte di bash, è possibile ottenere un vero one liner:
sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file
Alternativa:
sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file
Questo usa Matched Keyword
come flag nello spazio di attesa e, una volta impostato, qualsiasi elaborazione viene ridotta mediante salvataggio immediato.