grep バリアント pcregrep
をインストールする必要なし 、grep で複数行の検索を行うことができます。
$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c
説明:
-P
grep の perl-regexp をアクティブ化 (正規表現の強力な拡張)
-z
入力を一連の行として扱い、改行の代わりにゼロ バイト (ASCII NUL 文字) で終了します。つまり、grep は行の終わりがどこにあるかを認識していますが、入力を 1 つの大きな行として認識します。 -o
で使用すると、末尾に NUL 文字も追加されることに注意してください。 、コメントを参照してください。
-o
一致するものだけを印刷します。 -z
を使用しているため 、ファイル全体が単一の大きな行のようなものであるため、一致する場合はファイル全体が印刷されます。
正規表現:
(?s)
PCRE_DOTALL
を有効化 、つまり .
任意の文字または改行を検索します
\N
PCRE_DOTALL
であっても、改行以外はすべて検索します アクティブ化
.*?
.
を見つける 非貪欲モード、つまり、できるだけ早く停止します。
^
行頭を見つける
\1
最初のグループへの後方参照 (\s*
)。これはメソッドの同じインデントを見つけようとする試みです。
ご想像のとおり、この検索では main メソッドが C (*.c
) で出力されます。 ) ソースファイル。
私はgrepがあまり得意ではありません。しかし、この問題は AWK コマンドを使用して解決できます。参照してください
awk '/select/,/from/' *.sql
上記のコードは、select
が最初に出現した結果です。 from
の最初のシーケンスまで .ここで、返されたステートメントに customername
が含まれているかどうかを確認する必要があります か否か。このために、結果をパイプできます。また、awk または grep を再度使用できます。