回答:
2016年11月18日に更新(grepの動作が変更されたため、-Pパラメーターを指定したgrepは、[Ubuntu 16.04でカーネルv:4.4.0-21-generic]をサポート^
および$
アンカーしなくなりました)(間違った(非)修正)
$ grep -Pzo "begin(.|\n)*\nend" file
begin
Some text goes here.
end
注:他のコマンドについては、 '^'& '$'アンカーを改行アンカーに置き換えてください'\n'
______________________________
grepコマンドを使用:
grep -Pzo "^begin\$(.|\n)*^end$" file
結果にパターン「begin」と「end」を含めたくない場合は、LookbehindおよびLookaheadをサポートしたgrepを使用してください。
grep -Pzo "(?<=^begin$\n)(.|\n)*(?=\n^end$)" file
また\K
、Lookbehindアサーションの代わりにnotify を使用できます。
grep -Pzo "^begin$\n\K(.|\n)*(?=\n^end$)" file
\K
オプションは、パターンマッチングの前にすべてを無視し、パターン自体を無視します。
\n
出力から空行を印刷しないようにするために使用されます。
または、@ AvinashRajが示唆するように、次のような単純で簡単なgrepがあります。
grep -Pzo "(?s)^begin$.*?^end$" file
grep -Pzo "^begin\$[\s\S]*?^end$" file
(?s)
ドットが改行文字と一致することを許可するようにgrepに指示します。
[\s\S]
空白または空白以外の文字に一致します。
そして、「begin」と「end」を含まない出力は次のとおりです。
grep -Pzo "^begin$\n\K[\s\S]*?(?=\n^end$)" file # or grep -Pzo "(?<=^begin$\n)[\s\S]*?(?=\n^end$)"
grep -Pzo "(?s)(?<=^begin$\n).*?(?=\n^end$)" file
ここですべてのコマンドの完全なテストを参照してください(-Pパラメーターを使用したgrepの動作が変更されたため、古い)
^
行の始まりを指し、行$
の終わりを指します。これらは、「begin」と「end」の前後に追加され、それらが一列に並んでいる場合、それらを一致させます。
2つのコマンドでは、コマンドの出力でコマンド名を置き換えることができる$
「コマンド置換」($(command)
)も使用しているため、エスケープしました。
-o, --only-matching
Print only the matched (non-empty) parts of a matching line,
with each such part on a separate output line.
-P, --perl-regexp
Interpret PATTERN as a Perl compatible regular expression (PCRE)
-z, --null-data
Treat the input as a set of lines, each terminated by a zero byte (the ASCII
NUL character) instead of a newline. Like the -Z or --null option, this option
can be used with commands like sort -z to process arbitrary file names.
grep -Pzo "(?<=begin\n)(.|\n)*(?=\nend)" file
しないようにし\n
ます。
grep -Pzo "(?s)begin.*?end" file
grep -Pzo "begin[\s\S]*?end" file
grep: ein nicht geschütztes ^ oder $ wird mit -Pz nicht unterstützt
の翻訳は次のようになりますgrep: a not protected ^ or $ is not supported with -Pz
grep
が変更されたようです。