だから、例えば私たちは、ファイルに次き:複数行の正規表現 - 最後の試合の最後に行をスキップする方法
START OF NEW LOG ENTRY
first line
second line KEYWORD
third line
START OF NEW LOG ENTRY
first line
second line
third line
etc... (this file goes on in this manner for a long time)
...
私はキーワードの単語が含まれている各ログエントリのすべての行を抽出するために必要」キーワード"。これは、以下の(pcregrepを使用して)、対応する正規表現は次のとおりです。
pcregrep -Mo "(?s)(?:^START OF NEW LOG ENTRY)(?:.(?!^START OF NEW LOG ENTRY))*?(?:KEYWORD).*?(?=\nSTART OF NEW LOG ENTRY|\Z)" file
さて、これはうまく動作し、期待通りに次のように出力されます
START OF NEW LOG ENTRY
first line
second line KEYWORD
third line
だから、いただきました!間違っていますか? ...まあ、正規表現の仕組みは、そのログエントリ(行1〜4行)をマッチさせた後、正規表現エンジンが2行目から再びマッチしようとするため、正規表現エンジンは不必要に2行分をトラバースします2番目のログエントリの先頭からマッチングを開始するまでに時間がかかるように見えるので、最後のマッチが最後に終了した場所、つまり5行目を続けてください。
\G
を私の正規表現の始まりは((?s)
の後に)これを解決するだろうが、そうではない。
スマートなアイデアはありますか?