正確に言えば
Some text
begin
Some text goes here.
end
Some more text
「スタート」から「終了」までブロック全体を抽出したい。
awkを使用すると、これを行うことができます。
awk '/begin/,/end/' text
何をすべきですかgrep
?grep
これを行うことができるいくつかの* nix実装がありますか?
ベストアンサー1
grep
、これはg/re/p
基本的なツールです。血a と一致する行を印刷します。アル字型定期的な金利表現する。
あなたはここにもっと欲しいSトレメ編集する伊藤:
sed '/^begin$/,/^end$/!d'
または、すでに見つけたように、高度な言語を使用するより一般的なテキスト処理ツールですawk
。perl
しかし、いくつかのgrep
実装はもう少し進歩するかもしれません。
pcregrep -M '(?s)^begin$.*?^end$'
使用しているもの複数行パターン(-M
);改行文字も一致するように正規表現でPCREフラグを(?s)
切り替えます。s
.
現在のバージョンでは、合計が20kiB(または指定されたバッファサイズ)以上に分割されていると、正しく機能しない可能性がありpcregrep
ます。begin
end
たとえば、次のようになります。
(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$'
あるいは、grep
PCREをサポートするGNUビルドを使用し、ファイルにNUL文字が含まれていないとします。
grep -zoP '(?ms)^begin$.*?^end$'
ただし、これは検索を開始する前にファイル全体をメモリにロードすることを意味するgrep
ので、小さなファイル以外には使用しないでください。また、出力に NUL 文字を追加します。
とにかくgrep
そうです。いいえここに行くのが正しいです。