Grepマルチラインパターン


13

複数行にわたってフレーズを検索するにはどうすればよいですか?たとえば、「my ice tea」というフレーズを使用すると、テキストファイルでラップできます。

as js skdfh dfh djh sf my
ice tea.

間に改行があるため、grepは一致しません。それらをどのように一致させるのですか?別の複数行パターンはpattern1_\n_pattern2

私がATMをする最も簡単な方法は、たとえば-A2 -B2フラグを付けた氷だけで、その出力でお茶などのようにgrepすることです。しかし、これは非常に退屈です。だから私はあなたがこれをどのように解決するのか興味があります。


回答:


16

インストールpcregrepできます(ほとんどのディストリビューションリポジトリで利用可能)-これは、「Perl Compatible Regular Expressions」を行うpcreライブラリを使用したgrep です。-M複数行の検索を実行できるコマンドラインオプションがあります-man ページから:

「1つの一致の出力は、複数の行で構成される場合があります。」

だからできる

pcregrep -M 'my\s+ice\s+tea' filename

\sマッチするホワイトスペース、である\n\r通常の空白文字に加えて、複数行モードインチ 改行文字を直接一致させることもできますので、

pcregrep -M 'pattern1_\n_pattern2' filename

+1いいね。それを聞いたことがありませんが、試してみました、それは魅力のように動作します!
DaveParillo

grep -Epcreパターンを行いませんか?
デニス

3
@Daenythのgrep -Eは、ほとんどがちょうどあなたが使用できることを意味し ?+{|(、と)持ってなくても、通常の正規表現の意味として\ は、標準のgrepを使用する場合がそうであるように、前に。はとgrep 'hello\s\+world' file同等grep -E 'hello\s+world' fileです。PCREは行いません。grep -Pperlの正規表現がありますが、(manページによると)実験的であり、pcregrepとは少し異なると思います...
Hamish Downer

1
はい、私が-P言ったとき、私は考えていましたが、私は-Eそれが異なっていたことに気づきませんでした。
デニス

3

私はおそらくvim:vimgrepコマンドを使用して検索を行うでしょう。これは漠然と似た方法で機能しますgrepが、vim REとパスをサポートします。

基本的に:vimgrep 'pattern1\npattern2' path/**は、再帰検索のようなものを実行してから、入力:copenして一致するリストを含む小さなウィンドウを表示します。

vimREはPCREができることのほとんどすべてを実行できますが、perlの正規表現系統とは別に進化したため、高度なもののほとんどは異なる動作をします。基本的な機能は基本的なREの機能に似ていますが、PCREにはない素晴らしい追加機能がいくつかあります。

:vimgrepデータを吐き出すことができるかどうかはわかりませんgrep。私は今までにそれをナビゲーションに使用しようとしましたvim

:help vimgrepvim詳細については内部から。RE :help pattern.txtに関する情報vim。パスの詳細については、を参照してください:help wildcards


注意してください-それはそれは、異なるプラットフォーム上で異なる動作をしますと、完全にポータブルではありません
Daenyth

1
@Daenyth:異なる.vimrcの影響下にあるということですか?grepオペレーティングシステムよりも移植性が高い必要がvimあります。「POSIXフレーバー」はなく、Windowsでもほぼ同じように動作します。.................................................. ...........................修飾子を追加して、REで適切な量の「マジック」が使用されるようにすることは可能ですが、私はそれを理解しているように、そのオプションをそのままにしておくための厳格な不文律があります。
直観

私はそれを自分で使ったことはありませんが、どうやらWindowsで(バックグラウンドではfind.exeなくgrep)別のバックエンドを使用しています。過去数週間以内に、その問題があった別の質問がありました。
デニーズ

1
@Daenyth:あなたは考えています:vimgrep:grep?From :help grep:「内部grep [ie :vimgrep] の利点は、すべてのシステムで動作し、強力なVim検索パターンを使用することです。」
直観

1
ああ、それはそれであるに違いない。私は2つを混乱させました。
デニス

2

Grepは一度に1行でしか機能しませんが、awkを使用して、さまざまなパターンに一致する行を印刷できます。

cat file | awk '/foo/,/bar/'

2つのパターン間の改行だけでなく、あらゆるものに一致します。


0

UNIXを最大限に活用するには、パイプを利用する必要があります。あなたはgrepパイプを使用してプレーンでこれを行うことができます(ティーは必要ありません):

$ grep -A1 "pattern1" file.txt |  grep "pattern2"

私は退屈だとは思わないでしょう。


pattern1とpattern2の間にpattern3が存在する可能性があるため、これはエラーが発生しやすいと思います。したがって、各ヒットを手動で制御する必要があります。
数学
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.