一些sed
实现对此有支持。ssed
具有PCRE模式:
ssed -R 's/AB.*?AC/XXX/g'
使用增强型正则表达式时,AT&T ast sed具有连词和负号:
sed -A 's/AB(.*&(.*AC.*)!)AC/XXX/g'
可移植地,您可以使用此技术:将结束字符串(此处为AC
)替换为在开始或结束字符串中均不出现的单个字符(如此:
处),因此您可以这样做s/AB[^:]*://
,并且在输入中可能出现该字符的情况下,请使用与开头和结尾字符串不冲突的转义机制。
一个例子:
sed 's/_/_u/g; # use _ as the escape character, escape it
s/:/_c/g; # escape our replacement character
s/AC/:/g; # replace the end string
s/AB[^:]*:/XXX/g; # actual replacement
s/:/AC/g; # restore the remaining end strings
s/_c/:/g; # revert escaping
s/_u/_/g'
使用GNU时sed
,一种方法是使用换行符作为替换字符。因为一次只sed
处理一行,所以换行永远不会在模式空间中发生,因此可以做到:
sed 's/AC/\n/g;s/AB[^\n]*\n/XXX/g;s/\n/AC/g'
这通常不适用于其他sed
实现,因为它们不支持[^\n]
。使用GNU,sed
您必须确保未启用POSIX兼容性(例如使用POSIXLY_CORRECT环境变量)。