ファイル内の複数行パターンを検索するにはどうすればよいですか?
-
02-07-2019 - |
質問
特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、 xargs grep でパイプ処理された find を使用することです:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
しかし、複数の行にまたがるパターンを見つける必要がある場合、バニラgrepは複数行のパターンを見つけることができないため、立ち往生しています。
解決
それで、 pcregrep を発見しました。 Perl互換の正規表現GREP 。
たとえば、「 _name 」変数の直後に「 _description 」変数が続くファイルを見つける必要があります。
find . -iname '*.py' | xargs pcregrep -M '_name.*\n.*_description'
ヒント:パターンに改行文字を含める必要があります。プラットフォームによっては、「\ n」、「\ r」、「\ r \ n」、...
他のヒント
awk にアクセスしませんか:
>awk '/Start pattern/,/End pattern/' filename
grep -P
もlibpcreを使用しますが、より広くインストールされています。 HTMLドキュメントの完全な title
セクションを見つけるには、たとえそれが複数行にわたる場合でも、これを使用できます:
grep -P '(?s)<title>.*</title>' example.html
PCREプロジェクトはperl標準を実装しているため、参照用にperlのドキュメントを使用してください。
より便利な例を次に示します。
pcregrep -Mi "<title>(.*\n){0,5}</title>" afile.html
5行に及ぶ場合でも、htmlファイル内のタイトルタグを検索します。
無制限の行の例を次に示します。
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)を実行します。
@Marcin: awkの貪欲でない例:
awk '{if (<*> ~ /Start pattern/) {triggered=1;}if (triggered) {print; if (<*> ~ /End pattern/) { exit;}}}' filename