複数の行でフレーズを検索するにはどうすればよいですか?例えば。 「my ice tea」というフレーズを書いてみましょう。テキストファイルで囲むことができます。
as js skdfh dfh djh sf my
ice tea.
間に改行があるため、grepは一致しません。それらをどのように一致させますか?別の複数行パターンはpattern1_\n_pattern2
ATMを実行する最も簡単な方法は、一部のgrepだけであることを知っています。 -A2 -B2フラグを付けて氷にしてから、その出力でもう一度お茶。しかし、これは非常に退屈です。だから私はあなたがこれをどのように解決するかについて興味があります。
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
おそらく、vim
の:vimgrep
コマンドを使用して検索します。これはgrep
とほぼ同じように機能しますが、vim REとパスをサポートしています。
基本的には、再帰検索のために:vimgrep 'pattern1\npattern2' path/**
のようなものを実行し、次に:copen
と入力して、一致のリストを含む小さなウィンドウを表示します。
vim
REはPCREが実行できるほとんどすべてのことを実行できますが、Perlの正規表現の系統とは別に進化したため、ほとんどの高度な機能は異なる動作をします。基本的な機能は基本的なREの機能に似ていますが、PCREにはない便利な追加機能があります。
:vimgrep
がgrep
のようにデータを吐き出すことができるかどうかはわかりません。私はこれまでvim
内のナビゲーションに使用することを試みただけです。
詳細については、vim
内の:help vimgrep
をご覧ください。 vim
REの詳細については、:help pattern.txt
をご覧ください。パスの詳細については、:help wildcards
を参照してください。
Grepは一度に1行でしか機能しませんが、awkを使用してパターンの範囲に一致する行を印刷できます。
cat file | awk '/foo/,/bar/'
2つのパターン間の改行だけでなく、すべてに一致します
UNIXを最大限に活用するには、パイプを利用する必要があります。パイプを使用してプレーンgrep
でこれを行うことができます(T字型の必要はありません)。
$ grep -A1 "pattern1" file.txt | grep "pattern2"
退屈だとは思いません。