私はこれについていくつかの例を見ましたが、私の特別なケースでは動作しないようです。次のファイルがあるとします。
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)が表示されるのを防ぐためのより賢い方法が見つかりません。