特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、findxargs grepでパイプ処理することです:
find . -iname '*.py' | xargs grep -e 'YOUR_PATTERN'
しかし、複数の行にまたがるパターンを見つける必要がある場合、Vanilla 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を使用していますが、muchより広くインストールされています。 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
@Marcin:awkの貪欲でない例:
awk '{if ($0 ~ /Start pattern/) {triggered=1;}if (triggered) {print; if ($0 ~ /End pattern/) { exit;}}}' 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)を実行します。