Vous pouvez en quelque sorte le faire dans GNU sed :
sed '0,/Matched Keyword/s//New Inserted Line\n&/'
Mais ce n'est pas portable. Comme la portabilité est bonne, la voici dans awk :
awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile
Ou, si vous voulez passer une variable à print :
awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile
Ces deux éléments insèrent la ligne de texte avant la première occurrence du mot-clé, sur une ligne à part, selon votre exemple.
N'oubliez pas qu'avec sed et awk, le mot-clé correspondant est une expression régulière, pas seulement un mot-clé.
MISE À JOUR :
Étant donné que cette question est également étiquetée bash, voici une solution simple qui est purement bash et ne nécessite pas 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
En l'état, ceci comme un tuyau. Vous pouvez facilement l'envelopper dans quelque chose qui agit sur les fichiers à la place.
Si vous en voulez un avec sed* :
sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt
*fonctionne uniquement avec GNU sed
Cela pourrait fonctionner pour vous :
sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file
Vous y êtes presque ! Créez simplement une boucle pour lire à partir du Matched Keyword
à la fin du fichier.
Après avoir inséré une ligne, le reste du fichier peut être imprimé par :
- Présentation d'un espace réservé de boucle
:a
(icia
est un nom arbitraire). - Imprimez la ligne actuelle et récupérez la suivante dans l'espace du motif avec le
n
commande. - Rediriger le contrôle en utilisant le
ba
commande qui est essentiellement ungoto
aua
titulaire de place. La condition de fin de fichier est naturellement prise en charge par len
commande qui met fin à toute autre commande sed si elle essaie de lire au-delà de la fin de fichier.
Avec un peu d'aide de bash, une véritable doublure peut être réalisée :
sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file
Alternative :
sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file
Cela utilise le Matched Keyword
comme un drapeau dans l'espace d'attente et une fois qu'il a été défini, tout traitement est réduit en renflouant immédiatement.