パターンを見つけるにはgrepを実行する必要があり、パターンを見つけたら、そのパターンの前に別のパターンを見つけて、それらの間にあるすべての行を印刷する必要があります。
より良い例:
1 a
2 a
3 a
4 a
5 a
6 b
7 c
8 d
9 xyz
10 xyz
11 a
12 a
grepを押してxyz
から、最初のa
行をgrepしてxyz
すべての行を印刷します。
出力(最初に表示される出力、ファイルの他の出力はa
気にしない):a
5 a
6 b
7 c
8 d
9 xyz
10 xyz
ベストアンサー1
Perlの解決策は次のとおりです。
perl -nlE '
if (/a/) { @buffer = ($_) }
elsif (/xyz/) { push @buffer,$_; say for @buffer }
else { push @buffer,$_}
' your_file
どのように動作しますか?
ファイルを1行ずつ読み、次の3つの操作のいずれかを実行します。
- 現在の行がパターンと一致すると、
a
現在の行が配列に割り当てられます@buffer
。 - 現在の行がパターンと一致する場合は、
xyz
現在の行をバッファにプッシュし、バッファの内容を印刷します。 @buffer
上記のいずれも該当しない場合は、現在の行を配列に追加します。
したがって、新しい行がパターンと一致するたびに、内容が削除され、a
現在@buffer
の行にのみ置き換えられます。これにより、一番a
前にあるものが見つかりますxyz
。
もちろん、私が使用した正規表現をあなたのケースに関連する実際の正規表現に置き換える必要があります。