在用sed移除两个模式之间的字符串时,我遇到了问题。我总是有最后一种模式-2:
test.txt:
PATTERN-1xxxxPATTERN-2aaa
PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
PATTERN-1xxxxPATTERN-2bbbcmd
sed 's/PATTERN-1.*PATTERN-2//g' test.txt以上结果是
aaa
bbb但我想要
aaa
fffggg
bbb是否有可能找到模式-2最接近模式-1?
发布于 2017-01-12 15:30:39
正如@steeldriver所指出的,如果您有非贪婪的regexp,这是很容易的。如果没有,您可以使用一个循环来完成它,如下所示:
sed ':a;s/PATTERN-2/\n/;s/PATTERN-1.*\n//;ta' test.txt这是因为我们知道在任何行的中间没有换行符。它还将与任何行中没有出现的任何其他字符一起工作,例如§。
发布于 2017-01-12 15:50:54
如果只想使用sed,请尝试如下所示
sed 's/PATTERN-1[^P]*PATTERN-2//g' test.txt发布于 2018-02-12 16:40:26
在您的示例中,.*与您希望保留的内容相匹配。
您可以捕获这些内容并通过以下方法将其替换回来:
sed 's/PATTERN-1\(.*\)PATTERN-2/\1/g' test.txt括号之间的所有内容都存储在第一个捕获缓冲区中,而\1则替换为该缓冲区的值。
https://unix.stackexchange.com/questions/336677
复制相似问题