sed、一致した行がまだ存在しない場合にのみ行を追加します

sed、一致した行がまだ存在しない場合にのみ行を追加します

sed (GNU sed) 4.2.2 を使用して、次の操作を行います。

  1. マッチLine1
  2. Line2下記の がLine1等しいかどうか確認してくださいString
  3. そうでない場合は、String後に追加Line1(または前に挿入Line2)します。

私が試したこと:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

しかし、次のように返されます:

行1
文字列 行
2
文字
列 行3

私も試しました:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

しかし、それは戻ってくる

sed: -e 式 #1、文字 0: 一致しない `{'

sed を使用した別の方法も知っていますが、上で説明したとおりの方法で実現する方法を理解しようとしています。また、私のコードのどこが間違っているのか教えてください。

答え1

試す:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

制限: 2 行が連続して表示される場合Line1、期待どおりの動作をするかどうかはわかりません。

次のテスト ファイルを検討してみましょう。

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

そして、コマンドを適用してみましょう:

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

使い方

  • Line1/{...}

    これは、現在の行が正規表現と一致する場合にのみ、中括弧内のコマンドを実行しますLine1

  • N

    これは次の行を読み取り、改行で区切られた 2 行を現在の行に追加します。

  • /\nString$/b

    2 行目が正規表現に一致する場合は\nString$、残りのコマンド ("branch", b) をスキップします。

  • s/\n/\nString\n/

    これにより、最初の行と 2 番目の行を区切る改行が、改行とその後に続くString別の改行に置き換えられます。

関連情報