テストファイルは次のとおりです。
PATTERN1
a
b
c
PATTERN2
d
e
f
PATTERN2
g
h
PATTERN1
2番目の一致間の行を印刷したいですPATTERN2
。
PATTERN1
a
b
c
PATTERN2
d
e
f
PATTERN2
ベストアンサー1
1つの方法は次のとおりですsed
。
sed '/PATTERN1/,$!d;/PATTERN2/{x;//{x;q;};g;}' infile
これは、最初の発生(存在する場合)より前のすべての行を削除し、一致するすべてのPATTERN1
行PATTERN2
のバッファを変更しますx
。新しいパターン空間も一致する場合、これは第2の発生であることを意味するので、元のx
状態q
(自動印刷後)に戻される。一致しない場合は最初の出現という意味なので、パターン空間を介して予約空間の内容をコピーしg
(現在予約バッファに一致する行があるPATTERN2
)、続行します...
他の方法がありますawk
。
awk '/PATTERN1/{t=1}; t==1{print; if (/PATTERN2/){c++}}; c==2{exit}' infile
PATTERN2
一致する行に遭遇した場合のみ印刷を開始し、一致する行数を数え、PATTERN1
カウンタに達すると終了します。c
2