次のおもちゃの例を考えてみましょう。
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!