質問

特定の文字列パターンを含むすべてのファイルを見つける必要がありました。頭に浮かぶ最初の解決策は、 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

GNU grep を使用した例:

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

-z / -null-data 入力および出力データを一連の行として扱います。

こちら

もご覧ください。

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 

シルバーサーチャーを使用:

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

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

ここでgrepの代替 sift を使用できます(免責事項:私は著者です)。

複数行のマッチングをサポートし、検索を特定のファイルタイプに制限なしで制限します:

sift -m --files '*.py' 'YOUR_PATTERN'

(指定された複数行正規表現パターンのすべての* .pyファイルを検索)

すべての主要なオペレーティングシステムで使用できます。 サンプルページを見て、それを使用して複数行の値を抽出する方法を確認してくださいXMLファイル。

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

複数行検索の正規表現(grep)

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

grep --excludeを使用/-特定のファイルをgrepしない構文を含めます

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top