![2つのパターン間のすべての正規表現の一致を取得し、ファイルに出力します。](https://rvso.com/image/50567/2%E3%81%A4%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E9%96%93%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE%E3%81%AE%E4%B8%80%E8%87%B4%E3%82%92%E5%8F%96%E5%BE%97%E3%81%97%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AB%E5%87%BA%E5%8A%9B%E3%81%97%E3%81%BE%E3%81%99%E3%80%82.png)
長い行がたくさんあるファイルがあります。2 つのパターンの間にあるすべてのグループを取得して、1 行に 1 つの一致として新しいファイルに出力したいと思います。Python でこれを行うこともできますが、このタスクにはコマンド ライン ツールのみを使用することをお勧めします。終了パターンがない場合は、行の最後まですべてを取得したいと思います。
何かのようなもの:
input:
xxSTART relevanttext xxEND something else xxSTART even more relevant
output:
relevanttext
even more relevant
答え1
GNU grepがオプションである場合は、-P
(Perl互換の正規表現)フラグを渡し、先読みアサーション、後読みアサーション、非貪欲な一致を使用して必要なものを取り出すことができます。
echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant' |\
grep -oP '(?<=START).*?(?=xxEND|$)'
relevanttext
even more relevant
あるいはステファン・シャゼラスが提案するように、\K後読みアサーションの代わりに
echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant' |\
grep -oP 'START\K.*?(?=xxEND|$)'