146

特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、 xargs grepでパイプされたfindを使用することです。

find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'

しかし、複数行にまたがるパターンを見つける必要がある場合、バニラの grep は複数行のパターンを見つけることができないため、行き詰まります。

4

11 に答える 11

113

awkに行ってみませんか:

awk '/Start pattern/,/End pattern/' filename
于 2010-09-15T13:26:46.553 に答える
107

そこで、 Perl Compatible Regular Expressions GREPの略であるpcregrepを発見しました。

-M オプションを使用すると、行の境界にまたがるパターンを検索できます。

たとえば、' _name ' 変数の次の行に ' _description ' 変数が続くファイルを検索する必要あります。

find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'

ヒント: パターンに改行文字を含める必要があります。プラットフォームによっては、'\n'、\r'、'\r\n'、...

于 2008-09-30T11:54:44.207 に答える
105

GNUgrepを使用した例を次に示します。

grep -Pzo '_name.*\n.*_description'

-z/--null-data入力を一連の行として扱い、改行の代わりにゼロ バイト (ASCII NUL 文字) で終了します。

ファイル全体を 1 つの大きな行として扱う効果があります。説明はこちら

于 2008-09-30T12:07:43.270 に答える
24

grep -Pも libpcre を使用しますが、はるかに広くインストールされています。HTMLドキュメントの完全なセクションを見つけるには、titleそれが複数行にまたがっていても、これを使用できます:

grep -P '(?s)<title>.*</title>' example.html

PCRE プロジェクトは perl 標準に実装されているため、perl のドキュメントを参考にしてください。

于 2012-07-26T18:47:20.663 に答える
21

より便利な例を次に示します。

pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html

html ファイル内のタイトル タグが 5 行までの場合でも検索します。

無制限の回線の例を次に示します。

pcregrep -Mi "(?s)<title>.*</title>" example.html 
于 2008-09-30T12:36:49.457 に答える
11

シルバーサーチャー付:

ag 'abc.*(\n|.)*efg'

シルバー サーチャーの速度の最適化は、ここで活躍する可能性があります。

于 2015-01-13T21:05:33.803 に答える
3

この答えは役に立つかもしれません:

複数行検索用の正規表現 (grep) が必要

再帰的に検索するには、フラグ -R (再帰) および --include (GLOB パターン) を使用できます。見る:

grep --exclude/--include 構文を使用して、特定のファイルを grep しない

于 2011-08-24T03:19:57.020 に答える
3
perl -ne 'print if (/begin pattern/../end pattern/)' filename
于 2016-04-04T00:51:19.387 に答える
2

ex/viエディターとglobstar オプションの使用(awkとに似た構文sed):

ex +"/string1/,/string3/p" -R -scq! file.txt

aaaは開始点でありbbb、終了テキストはどこですか。

再帰的に検索するには、次を試してください。

ex +"/aaa/,/bbb/p" -scq! **/*.py

注:**構文を有効にするには、 shopt -s globstar(Bash 4 または zsh) を実行します。

于 2015-10-16T23:11:30.097 に答える