获取两个模式之间的所有正则表达式匹配并将它们打印到文件

use*_*020 4 grep sed regular-expression

我有一个包含一堆长行的文件。我想抓住两个模式之间的每一组并将它们打印到一个新文件中,每行一个匹配。我可以设法用 Python 做到这一点,但我更喜欢只使用命令行工具来完成这项任务。如果没有结束模式,我想抓住一切,直到行尾。

就像是:

input: 
xxSTART relevanttext xxEND something else xxSTART even more relevant

output:
relevanttext
even more relevant
Run Code Online (Sandbox Code Playgroud)

iru*_*var 6

如果 GNU grep 是一个选项,您可以传递-P(与 perl 兼容的正则表达式)标志并使用前瞻断言、后视断言和非贪婪匹配来提取您需要的内容

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP '(?<=START).*?(?=xxEND|$)'
relevanttext
even more relevant
Run Code Online (Sandbox Code Playgroud)

或者正如 Stephane Chazelas 建议的那样,使用漂亮的\K代替后视断言

echo 'xxSTART relevanttext xxEND something else xxSTART even more relevant'  |\
grep -oP 'START\K.*?(?=xxEND|$)' 
Run Code Online (Sandbox Code Playgroud)