1

私は以下のようなパターンを持っています

Start
Hi
How
Are
You
End
Hi
Start
Hi
How
do
You
Do
End

最初Startとの間に文字列が必要Endです。

Start2番目と。の間の文字列は必要ありませんEnd

これを行う方法はありますか?

4

4 に答える 4

5

これは私にとってはうまくいくようです:

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
于 2012-10-17T15:07:53.877 に答える
2

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
于 2012-10-17T20:16:58.577 に答える
2

これはあなたのために働くかもしれません(GNU sed):

sed -n '/Start/,${//!p;/End/q}' file
于 2012-10-18T00:02:19.433 に答える
1

edスクリプトを使用してそれを行うこともできます。

<<< '/Start/+1,/End/-1p' | ed -s infile

出力:

Hi
How
Are
You
于 2012-10-17T15:21:47.673 に答える