文字列を Grepping するが、各 grep マッチの後に空でないすべての行を含みます。

文字列を Grepping するが、各 grep マッチの後に空でないすべての行を含みます。

次のおもちゃの例を考えてみましょう。

this is a line 
this line contains FOO 
this line is not blank

This line also contains FOO

Some random text

This line contains FOO too
Not blank 
Also not blank

More random text 
FOO!
Yet more random text
FOO!

したがって、FOOのgrepの結果が欲しいが、いくつかの追加の問題があります。つまり、空でなくFOOを含まない限り、一致する行に続く行を含める必要があります。したがって、一致は、異なる一致が区別され、次のように表示されます。

ゲーム1

this line contains FOO 
this line is not blank

ゲーム2

This line also contains FOO

ゲーム3

This line contains FOO too 
Not blank 
Also not blank

ゲーム4

FOO!
Yet more random text

ゲーム5

FOO!

コマンドラインで実行できる単純な1行スクリプトのボーナスポイントです(比喩的に言えば)。

付録:ゲーム番号に実行回数を追加することはそれほど難しくない場合は非常に便利です。

ベストアンサー1

awk代わりに使用してくださいgrep

awk '/FOO/ { if (matching) printf("\n"); matching = 1 }
     /^$/  { if (matching) printf("\n"); matching = 0 }
     matching' file

一致するバージョンを列挙します。

awk 'function flush_print_maybe() {
         if (matching) printf("Match %d\n%s\n\n", ++n, buf)
         buf = ""
     }
     /FOO/ { flush_print_maybe(); matching = 1 }
     /^$/  { flush_print_maybe(); matching = 0 }
     matching { buf = (buf == "" ? $0 : buf ORS $0) }
     END   { flush_print_maybe() }' file

どちらのawkプログラムも、非常に単純な「状態マシン」を使用して、現在一致するものがあるかどうかを確認します。パターンが一致すると状態にFOOなりmatching、パターン^$(空行)が一致すると状態ではなく状態になりますmatching

状態遷移時に、一致するデータセット間に空の出力行が発生します。~から matching(入力またはmatching入力しないmatching)。

最初のプログラムはmatchingこの状態の間にすべての行を印刷します。

2番目のプログラムは、buf特定の状態の変数にある行を収集しますmatching。印刷後(状態に応じて)空にし、状態Match N遷移時にラベルも空にします(最初のプログラムが空白行を出力するとき)。

サンプルデータの最後のプログラムの出力は次のとおりです。

Match 1
this line contains FOO
this line is not blank

Match 2
This line also contains FOO

Match 3
This line contains FOO too
Not blank
Also not blank

Match 4
FOO!
Yet more random text

Match 5
FOO!

おすすめ記事