Můžete to udělat v GNU sed:
sed '0,/Matched Keyword/s//New Inserted Line\n&/'
Ale není přenosný. Protože přenositelnost je dobrá, zde je v awk:
awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile
Nebo, pokud chcete předat proměnnou k tisku:
awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile
Oba vkládají textový řádek před první výskyt klíčového slova na samostatném řádku podle vašeho příkladu.
Pamatujte, že v případě sed i awk je odpovídající klíčové slovo regulárním výrazem, nikoli pouze klíčovým slovem.
AKTUALIZACE:
Protože tato otázka je také označena jako bash, zde je jednoduché řešení, které je čistý bash a nevyžaduje 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
Jak to stojí, tohle je dýmka. Můžete jej snadno zabalit do něčeho, co funguje se soubory.
Pokud chcete jeden se sed*:
sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt
*funguje pouze s GNU sed
Toto by vám mohlo fungovat:
sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file
Už jste skoro tam! Stačí vytvořit smyčku pro čtení z Matched Keyword
na konec souboru.
Po vložení řádku lze zbytek souboru vytisknout pomocí:
- Představujeme zástupný symbol smyčky
:a
(zdea
je libovolný název). - Vytiskněte aktuální řádek a načtěte další do prostoru vzoru pomocí
n
příkaz. - Řízení přesměrování zpět pomocí
ba
příkaz, který je v podstatěgoto
naa
držitel místa. O stav konce souboru se přirozeně starán
příkaz, který ukončí všechny další příkazy sed, pokud se pokusí přečíst konec souboru.
S trochou pomoci od bash lze dosáhnout skutečného one lineru:
sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file
Alternativa:
sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file
Toto používá Matched Keyword
jako vlajka v zadržovacím prostoru a jakmile je nastaven, jakékoli zpracování je omezeno okamžitou kaucí.