私はstartStr
ケースとの間のすべてを得るために努力しています。私は使用方法とその間に発生するすべてのイベントを理解しています。発生事例を1つだけ制限する方法がわかりません。endStr
bbb
startStr
endStr
sed
bbb
入力例:
fff
startStr
aaa
bbb
ccc
endStr
xxx
yyy
startStr
ddd
endStr
ddd
bbb
希望の出力:
startStr
aaa
bbb
ccc
endStr
これが私が持っているものです:
$ sed -n -e '/startStr/,/endStr/ p' sample.txt
startStr
aaa
bbb
ccc
endStr
startStr
ddd
endStr
ベストアンサー1
最初のstartStr
...については、endStr
次が含ま/bbb/
れます。
sed -n '/startStr/ {:n; N; /endStr/ {/\n[^\n]*bbb[^\n]*\n/ {p; q}; b}; bn}'
または
sed -n '/startStr/ {:n; N; /endStr/ {/\nbbb\n/ {p; q}; b}; bn}'
正規表現でない場合は、bbb
正確に必要な文字列です(最初からから\n
)。
説明する
住所の場合/startStr/
:
:n
ラベル設定- 次の行を読む
N
。 - 一致していることを確認してください
/endStr/
。- これが本当なら、
/\nbbb\n/
私たちが読んだこのブロックで発生を確認してください。- ある場合は、
{p; q}
「印刷と終了」を実行します。 - それ以外の場合は、
b
「このブロックをスローして次のブロックの検索を開始します」を実行します。
- ある場合は、
- これが本当なら、
- ブロックの終わりでない場合に移動します
:n
。つまり、読み続けます。