1. ホーム
  2. regex

[解決済み】複数行検索のための正規表現(grep)が必要です【重複

2022-04-04 19:02:10

質問

を実行しています。 grep という単語を持つすべての *.sql ファイルを検索します。 select の後に続く単語 customerName に続いて、単語 from . このSELECT文は何行にも渡ることができ、タブや改行を含むことができます。

以下のように、いくつかのバリエーションを試してみました。

$ grep -liIr --include="*.sql" --exclude-dir="\.svn*" --regexp="select[a-zA-Z0-
9+\n\r]*customerName[a-zA-Z0-9+\n\r]*from"

しかし、これは永遠に実行されるだけです。どなたか正しい構文を教えていただけませんか?

どのように解決するのですか?

grep の亜種をインストールする必要なし pcregrep を使用すると、grepで複数行の検索ができます。

$ grep -Pzo "(?s)^(\s*)\N*main.*?{.*?^\1}" *.c

説明する。

-P 起動 正規表現 grep 用 (正規表現の強力な拡張)

-z 入力を一連の行として扱い、それぞれの行を改行ではなくゼロバイト(ASCIIのNUL文字)で終了させます。つまり、grepは行末がどこであるかを知っていますが、入力を1つの大きな行として見ています。 と一緒に使うと、末尾に NUL 文字が追加されることに注意してください。 -o コメントをご覧ください。

-o マッチングのみを印刷します。なぜなら -z このようにすると、ファイル全体が1つの大きな行のようになるので、マッチした場合はファイル全体が印刷されることになりますが、この方法ではそのようなことはありません。

正規表現では

(?s) 起動 PCRE_DOTALL ということになります。 . は、任意の文字または改行

\N を使っても、改行以外を見つけることができます。 PCRE_DOTALL が起動しました。

.*? 見つける . を、欲張らないモードで、つまり、できるだけ早く停止させる。

^ 行頭を探す

\1 最初のグループへのバックリファレンス ( \s* ). これは、メソッドのインデントが同じものを探すための試みです。

ご想像の通り、この検索ではメインメソッドがC言語( *.c ) ソースファイルです。