
sed (GNU sed) 4.2.2 を使用して、次の操作を行います。
- マッチ
Line1
Line2
下記の がLine1
等しいかどうか確認してくださいString
- そうでない場合は、
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
別の改行に置き換えられます。