パターンを検索し、別のパターンで始まる最初の数行を印刷します。

パターンを検索し、別のパターンで始まる最初の数行を印刷します。

パターンを見つけるには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つの操作のいずれかを実行します。

  1. 現在の行がパターンと一致すると、a現在の行が配列に割り当てられます@buffer
  2. 現在の行がパターンと一致する場合は、xyz現在の行をバッファにプッシュし、バッファの内容を印刷します。
  3. @buffer上記のいずれも該当しない場合は、現在の行を配列に追加します。

したがって、新しい行がパターンと一致するたびに、内容が削除され、a現在@bufferの行にのみ置き換えられます。これにより、一番a前にあるものが見つかりますxyz

もちろん、私が使用した正規表現をあなたのケースに関連する実際の正規表現に置き換える必要があります。

おすすめ記事