パターン1とパターン2の2番目の一致の間の線をどのように印刷しますか?

パターン1とパターン2の2番目の一致の間の線をどのように印刷しますか?

テストファイルは次のとおりです。

PATTERN1
a
b
c
PATTERN2
d
e
f
PATTERN2
g
h

PATTERN12番目の一致間の行を印刷したいですPATTERN2

PATTERN1
a
b
c
PATTERN2
d
e
f
PATTERN2

ベストアンサー1

1つの方法は次のとおりですsed

sed '/PATTERN1/,$!d;/PATTERN2/{x;//{x;q;};g;}' infile

これは、最初の発生(存在する場合)より前のすべての行を削除し、一致するすべてのPATTERN1PATTERN2のバッファを変更しますx。新しいパターン空間も一致する場合、これは第2の発生であることを意味するので、元のx状態q(自動印刷後)に戻される。一致しない場合は最初の出現という意味なので、パターン空間を介して予約空間の内容をコピーしg(現在予約バッファに一致する行があるPATTERN2)、続行します...
他の方法がありますawk

awk '/PATTERN1/{t=1}; t==1{print; if (/PATTERN2/){c++}}; c==2{exit}' infile

PATTERN2一致する行に遭遇した場合のみ印刷を開始し、一致する行数を数え、PATTERN1カウンタに達すると終了します。c2

おすすめ記事