我使用
grep
创建了一个测试,但它在 sed
中不起作用。
grep -P '(?<=foo)bar' file.txt
返回
bar
即可正常工作。
sed 's/(?<=foo)bar/test/g' file.txt
我期待
footest
作为输出,但它不起作用。
GNU sed 不支持环视断言。您可以使用更强大的语言,例如 Perl,或者尝试使用支持 Perl 风格正则表达式的
ssed
。
perl -pe 's/(?<=foo)bar/test/g' file.txt
请注意,大多数时候您可以使用捕获组和替换字符串中的反向引用来避免向后查找(或先行查找):
sed 's/\(foo\)bar/\1test/g' file.txt
模拟负向后查找更加微妙,需要多次替换来保护您想要避免的子字符串。
(?<!foo)bar
的示例:
sed 's/#/##/g;s/foobar/foob#ar/g;s/bar/test/g;s/foob#ar/foobar/g;s/##/#/g' file.txt
#
=> ##
)。foobar
=> foob#ar
或 ba
=> b#a
)。foob#ar
替换为 foobar
(或将 b#a
替换为 ba
)。##
替换为 #
。显然,您还可以描述捕获组中
foo
之前不是 bar
的所有内容:
sed -E 's/(^.{0,2}|[^f]..|[^o].?)bar/\1test/g' file.txt
但是角色越多,它很快就会变得乏味。