を実行して、 という単語の後に という単語が続き、さらに という単語が続くgrep
*.sql ファイルを検索しています。この選択ステートメントは複数の行にまたがることができ、タブや改行を含めることができます。select
customerName
from
私は次のようないくつかのバリエーションを試しました:
$ grep -liIr --include="*.sql" --exclude-dir="\.svn*" --regexp="select[a-zA-Z0-
9+\n\r]*customerName[a-zA-Z0-9+\n\r]*from"
ただし、これは永遠に実行されます。正しい構文を教えていただけませんか?
ベストアンサー1
grep バリアントをインストールしなくてもpcregrep
、grep を使用して複数行の検索を行うことができます。
$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c
説明:
-P
活性化perl 正規表現grep(正規表現の強力な拡張機能)
-z
入力を、改行ではなくゼロ バイト (ASCII NUL 文字) で終了する行のセットとして扱います。つまり、grep は行の終わりがどこにあるかを認識しますが、入力は 1 つの大きな行として認識されます。 と一緒に使用すると-o
、末尾に NUL 文字も追加されることに注意してください。コメントを参照してください。
-o
一致するものだけを印刷します。 を使用しているため-z
、ファイル全体が 1 行の大きな行のようになり、一致するものがあればファイル全体が印刷されますが、この方法ではそうはなりません。
正規表現の場合:
(?s)
をアクティブ化するPCRE_DOTALL
と、.
任意の文字または改行文字が検索されます
\N
PCRE_DOTALL
有効であっても改行以外のものを検索します
.*?
非貪欲モードでfind を実行します.
。つまり、できるだけ早く停止します。
^
行の先頭を見つける
\1
最初のグループ ( \s*
) への後方参照。これは、メソッドの同じインデントを見つけようとする試みです。
ご想像のとおり、この検索では C () ソース ファイル内のメイン メソッドが出力されます*.c
。