3 つの値を持つ複数行にわたる正規表現マッチング

3 つの値を持つ複数行にわたる正規表現マッチング

この例をいくつか見たことがありますが、私の特定の状況ではうまく機能しないようです。以下のファイルがあるとします。

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

私は '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/ が見つかったら、/baz/ が見つかったら保存した行を印刷します。

手動でテストせずに (私が行っているように)、「out」変数の先頭に空白行 (ORS) が表示されないようにするよりスマートな方法が見つかりません。

関連情報