特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、 xargs grepでパイプされたfindを使用することです。
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
しかし、複数行にまたがるパターンを見つける必要がある場合、バニラの grep は複数行のパターンを見つけることができないため、行き詰まります。
特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、 xargs grepでパイプされたfindを使用することです。
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
しかし、複数行にまたがるパターンを見つける必要がある場合、バニラの grep は複数行のパターンを見つけることができないため、行き詰まります。
awkに行ってみませんか:
awk '/Start pattern/,/End pattern/' filename
そこで、 Perl Compatible Regular Expressions GREPの略であるpcregrepを発見しました。
-M オプションを使用すると、行の境界にまたがるパターンを検索できます。
たとえば、' _name ' 変数の次の行に ' _description ' 変数が続くファイルを検索する必要があります。
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
ヒント: パターンに改行文字を含める必要があります。プラットフォームによっては、'\n'、\r'、'\r\n'、...
grep -P
も libpcre を使用しますが、はるかに広くインストールされています。HTMLドキュメントの完全なセクションを見つけるには、title
それが複数行にまたがっていても、これを使用できます:
grep -P '(?s)<title>.*</title>' example.html
PCRE プロジェクトは perl 標準に実装されているため、perl のドキュメントを参考にしてください。
より便利な例を次に示します。
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
html ファイル内のタイトル タグが 5 行までの場合でも検索します。
無制限の回線の例を次に示します。
pcregrep -Mi "(?s)<title>.*</title>" example.html
この答えは役に立つかもしれません:
再帰的に検索するには、フラグ -R (再帰) および --include (GLOB パターン) を使用できます。見る:
perl -ne 'print if (/begin pattern/../end pattern/)' filename
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) を実行します。