GNU sed でこれを行うことができます:
sed '0,/Matched Keyword/s//New Inserted Line\n&/'
しかし、それはポータブルではありません。移植性が良いので、ここでは awk:
awk '/Matched Keyword/ && !x {print "Text line to insert"; x=1} 1' inputFile
または、print に変数を渡したい場合:
awk -v "var=$var" '/Matched Keyword/ && !x {print var; x=1} 1' inputFile
これらはどちらも 前 にテキスト行を挿入します あなたの例によると、キーワードの最初の出現、それ自体の行。
sed と awk の両方で、一致するキーワードは単なるキーワードではなく正規表現であることに注意してください。
更新:
この質問には bash のタグも付けられているため、純粋な bash で 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
このままではパイプとして。代わりに、ファイルに作用するもので簡単にラップできます。
sed* が必要な場合:
sed '0,/Matched Keyword/s//Matched Keyword\nNew Inserted Line/' myfile.txt
*GNU sed でのみ動作
これはあなたのために働くかもしれません:
sed -i -e '/Matched Keyword/{i\New Inserted Line' -e ':a;n;ba}' file
あなたはもうすぐそこにいます! Matched Keyword
から読み取るループを作成するだけです ファイルの最後まで。
行を挿入した後、ファイルの残りの部分は次の方法で印刷できます:
<オール>:a
(ここでは a
は任意の名前です)。n
でパターン空間にフェッチします コマンドba
を使用してコントロールをリダイレクトします 基本的に goto
であるコマンド a
に プレースホルダー。ファイルの終わりの状態は、n
によって自然に処理されます。 ファイルの終わりを超えて読み取ろうとすると、それ以降の sed コマンドを終了するコマンド。bash の助けを借りて、真のワンライナーを実現できます:
sed $'/Matched Keyword/{iNew Inserted Line\n:a;n;ba}' file
代替:
sed 'x;/./{x;b};x;/Matched Keyword/h;//iNew Inserted Line' file
これは Matched Keyword
を使用します ホールド スペースのフラグとして設定され、一度設定されると、すぐにベイル アウトすることで処理が短縮されます。