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(iciaest un nom arbitraire). - Imprimez la ligne actuelle et récupérez la suivante dans l'espace du motif avec le
ncommande. - Rediriger le contrôle en utilisant le
bacommande qui est essentiellement ungotoauatitulaire de place. La condition de fin de fichier est naturellement prise en charge par lencommande 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.