複数行にわたって3つの値を一致させる正規表現[重複]

複数行にわたって3つの値を一致させる正規表現[重複]

私はこれについていくつかの例を見ましたが、私の特別なケースでは動作しないようです。次のファイルがあるとします。

foo
line 1
line 2
line 3
bar
junk
junk
foo
line 1
line 2
baz
line 4
bar

1行に「baz」が含まれている限り、「foo」と「bar」の間のすべての内容をキャプチャしようとしています。

今まで私が見つけたすべては、fooとbarの間のすべてを見つけるのにはうまくいきますが、bazを含むアイテムを見つけるのには何もうまくいきません。

編集:以下は私にとって効果的でした。

sed -n '/foo/{:a;N;/bar/!ba; /baz/p}' input.txt

答え1

awk '
/foo/ { save=1 }
/baz/ { p=1 }
/bar/ { if (p) { print out ORS $0; } p=0; save=0; out="" }
{ if (save) { if (out) { out = out ORS $0 } else { out = $0 } } }
' input

/foo/; が表示されたら、行の保存を開始します。 /baz/が表示されている場合は印刷する価値があると判断し、/bar/が表示されている場合は保存した行を印刷します。

私が行ったように、手動でテストしないと、「out」変数の先頭に空白行(ORS)が表示されるのを防ぐためのより賢い方法が見つかりません。

関連情報