sed 并删除两个模式之间的字符串

Mac*_*iej 5 sed regular-expression

我在使用 sed 删除两个模式之间的部分字符串时遇到问题。我总是将最后一个 PATTERN-2 排成一行:

测试.txt:

PATTERN-1xxxxPATTERN-2aaa
PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
PATTERN-1xxxxPATTERN-2bbb
Run Code Online (Sandbox Code Playgroud)

指令

sed 's/PATTERN-1.*PATTERN-2//g' test.txt
Run Code Online (Sandbox Code Playgroud)

上面的结果是

aaa

bbb
Run Code Online (Sandbox Code Playgroud)

但我想要

aaa
fffggg
bbb
Run Code Online (Sandbox Code Playgroud)

是否可以找到最接近 PATTERN-1 的 PATTERN-2?

Mic*_*hrs 3

正如 @steeldriver 指出的,如果您有非贪婪的正则表达式,这很容易。如果没有,您可以使用循环来完成,如下所示:

\n\n
sed ':a;s/PATTERN-2/\\n/;s/PATTERN-1.*\\n//;ta' test.txt\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是有效的,因为我们知道任何行的中间都没有换行符。它也适用于未出现在任何行中的任何其他字符,例如\xc2\xa7

\n