複数行で複数のパターンを見つけるためにgrepする方法は?

複数行で複数のパターンを見つけるためにgrepする方法は?

正確に言えば

Some text
begin
Some text goes here.
end
Some more text

「スタート」から「終了」までブロック全体を抽出したい。

awkを使用すると、これを行うことができます。

awk '/begin/,/end/' text

何をすべきですかgrepgrepこれを行うことができるいくつかの* nix実装がありますか?

ベストアンサー1

grep、これはg/re/p基本的なツールです。a と一致する行を印刷します。アル字型定期的な金利表現する。

あなたはここにもっと欲しいSトレメ編集する伊藤:

sed '/^begin$/,/^end$/!d'

または、すでに見つけたように、高度な言語を使用するより一般的なテキスト処理ツールですawkperl

しかし、いくつかのgrep実装はもう少し進歩するかもしれません。

pcregrep -M '(?s)^begin$.*?^end$'

使用しているもの複数行パターン(-M);改行文字も一致するように正規表現でPCREフラグを(?s)切り替えます。s.

現在のバージョンでは、合計が20kiB(または指定されたバッファサイズ)以上に分割されていると、正しく機能しない可能性がありpcregrepます。beginend

たとえば、次のようになります。

(seq 12091; echo begin; seq 4315; echo end; seq 10) |
   pcregrep -M '(?s)^begin$.*?^end$'

しかし、以下ではそうではありません。

(seq 12091; echo begin; seq 4316; echo end; seq 10) |
   pcregrep -M '(?s)^begin$.*?^end$'

あるいは、grepPCREをサポートするGNUビルドを使用し、ファイルにNUL文字が含まれていないとします。

grep -zoP  '(?ms)^begin$.*?^end$'

ただし、これは検索を開始する前にファイル全体をメモリにロードすることを意味するgrepので、小さなファイル以外には使用しないでください。また、出力に NUL 文字を追加します。

とにかくgrepそうです。いいえここに行くのが正しいです。

おすすめ記事