GNU/Linux >> Linux の 問題 >  >> Linux

最初の一致でのみ挿入する sed

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 を使用します ホールド スペースのフラグとして設定され、一度設定されると、すぐにベイル アウトすることで処理が短縮されます。


    Linux
    1. ファイルの最初の行の前にテキストを挿入する方法は?

    2. Sedを使用してパターンマッチ後に前の行を印刷しますか?

    3. Sedは改行文字を置き換えることができますか?

    1. 一致するまですべてのファイルを表示しますか?

    2. 特定の行でOsxインサートをSedしますか?

    3. grep は指定された範囲内の行のみに一致します

    1. 各行でN番目の一致が見つかった後のパターンの置き換え??

    2. 2 つのファイルの最初の行だけを比較するには?

    3. 複数行の Sed 置換