web-dev-qa-db-ja.com

Grepマルチラインパターン

複数の行でフレーズを検索するにはどうすればよいですか?例えば。 「my ice tea」というフレーズを書いてみましょう。テキストファイルで囲むことができます。

as js skdfh dfh djh sf my
ice tea.

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

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

13
math

pcregrep(ほとんどのディストリビューションリポジトリで利用可能)をインストールできます。これは、「Perl互換の正規表現」を実行する pcre library を使用したgrepです。コマンドラインオプション-Mを使用すると、 man page から複数行の検索を実行できます。

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

だからあなたはできる

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

\sは空白であり、通常の空白文字に加えて、複数行モードの\nおよび\rと一致します。改行文字を直接一致させることもできるので、

pcregrep -M 'pattern1_\n_pattern2' filename
16
Hamish Downer

おそらく、vim:vimgrepコマンドを使用して検索します。これはgrepとほぼ同じように機能しますが、vim REとパスをサポートしています。

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

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

:vimgrepgrepのようにデータを吐き出すことができるかどうかはわかりません。私はこれまでvim内のナビゲーションに使用することを試みただけです。

詳細については、vim内の:help vimgrepをご覧ください。 vim REの詳細については、:help pattern.txtをご覧ください。パスの詳細については、:help wildcardsを参照してください。

3
intuited

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

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

2つのパターン間の改行だけでなく、すべてに一致します

2
DaveParillo

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

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

退屈だとは思いません。

0
Baruch