私は以下のようなパターンを持っています
Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End
最初Start
との間に文字列が必要End
です。
Start
2番目と。の間の文字列は必要ありませんEnd
。
これを行う方法はありますか?
これは私にとってはうまくいくようです:
sed -n '/Start/{:a;n;/End/q;p;ba}'
$ echo 'Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End' | sed -n '/Start/{:a;n;/End/q;p;ba}'
Hi
How
Are
You
sedは、1行で簡単に置き換えるための優れたツールです。それ以外の場合はawkを使用します。
$ awk '/End/{exit} found{print} /Start/{found=1}' file
Hi
How
Are
You
現在の行にStartが含まれている場合は、「found」フラグを設定します。次の行とそれに続くすべての行で、見つかったフラグが設定されているので、その行を印刷します。「End」を含む行が表示されたら、終了します。すべて非常にシンプルで、将来必要に応じて、{}パーツを移動するだけで、開始、終了、またはその両方を印刷するかどうかを簡単に制御できます。
$ awk '/End/{exit} /Start/{found=1} found{print}' file
Start
Hi
How
Are
You
$ awk 'found{print} /End/{exit} /Start/{found=1}' file
Hi
How
Are
You
End
$ awk '/Start/{found=1} found{print} /End/{exit}' file
Start
Hi
How
Are
You
End
または、開始/終了の間のすべてのセグメントが必要な場合は、終了するのではなく、見つかったフラグをゼロに戻します。
$ awk '/End/{found=0} found; /Start/{found=1}' file
Hi
How
Are
You
Hi
How
do
You
Do
コメントで提案されているように、開始の前に終了が発生する可能性がある場合は、スクリプトを微調整して、「見つかった」ブロック内の終了のみをテストします。
awk 'found{ if (/End/) exit; print } /Start/{ found=1 }' file
これはあなたのために働くかもしれません(GNU sed):
sed -n '/Start/,${//!p;/End/q}' file
ed
スクリプトを使用してそれを行うこともできます。
<<< '/Start/+1,/End/-1p' | ed -s infile
出力:
Hi
How
Are
You