複数行検索には正規表現(grep)が必要です [重複] 質問する

複数行検索には正規表現(grep)が必要です [重複] 質問する

を実行して、 という単語の後に という単語が続き、さらに という単語が続くgrep*.sql ファイルを検索しています。この選択ステートメントは複数の行にまたがることができ、タブや改行を含めることができます。selectcustomerNamefrom

私は次のようないくつかのバリエーションを試しました:

$ 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と、.任意の文字または改行文字が検索されます

\NPCRE_DOTALL有効であっても改行以外のものを検索します

.*?非貪欲モードでfind を実行します.。つまり、できるだけ早く停止します。

^行の先頭を見つける

\1最初のグループ ( \s*) への後方参照。これは、メソッドの同じインデントを見つけようとする試みです。

ご想像のとおり、この検索で​​は C () ソース ファイル内のメイン メソッドが出力されます*.c

おすすめ記事