複数行の開始タグと終了タグを使用してパターン別にテキストを取得する[重複]

複数行の開始タグと終了タグを使用してパターン別にテキストを取得する[重複]

欲求不満な方法で開始タグと終了タグを含むパターンを持つファイルから複数行を取得したいと思います。

たとえば、次のような入力があります。

ファイル.txt

START
test1
test2
foo
END
some
more text

START
test3
bar
test4
test5
END
even more

START
baz
test6
END

今私は探したいバー間のすべての内容を印刷します。スタートそして終わりだから私は次のようになります:

START
test3
bar
test4
test5
END

これまで私が持っているのは、次のgrepコマンドです。

grep -Pzo '(?s)START.*?bar.*?END' file.txt

問題は、この式が貪欲であり、次のように印刷されることです。

START      # starts at first "START"-tag, not the next one
test1      #
test2      #
foo        #
END        #
some       #
more text  #

START
test3
bar
test4
test5
END

grepフラグはまだ完了していません。--コンテキスト前/--コンテキスト後、前と後の行数が異なる可能性があるためです。

テキスト処理に使用されるツールは重要ではありません。通常のRedHatシステムで実行する必要があります。また、ツールが線をつかむ速度が速いほど良いです。約150MBの大容量ログファイルがあるためです。

誰かが私の目標を最もよく達成する方法を教えてもらえますか?


修正する:

はい、わかりました。don_crissti■リンクからコマンドを作成する方法を考えるだけです。解決策は次のとおりです。

ed -s file.txt <<< $'g/bar/?START?,/END/p\nq\n'

速い助けてくれてありがとう!

うん、結局繰り返しだった…

ベストアンサー1

私の考えでは、あなたの問題は、貪欲ではないマッチがあなたが望むよりも多く食べることができるということです。終わりスタートS.これはうまくいくようです:

grep -Pzo '(?s)START(?:(?!END).)*?bar(?:(?!START).)*?END' file.txt

例のすべてのケースをカバーし、完了した場合>> file.txt

bar
START
test7
END

まだ有効です。

おすすめ記事