为什么这个正向前瞻正则表达式 'string.*?(?= )' 在 sed 中不起作用?

为什么这个正向前瞻正则表达式 'string.*?(?= )' 在 sed 中不起作用?

我有一长串类似的清单:

AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

全部在单行中。基本上是一堆用户名@ip

我想仅通过使用其用户名(例如 aaa)进行查找和替换,然后将其替换为任何内容。

我测试了我的正则表达式(正则表达式)并且它按我的预期工作。但是当我尝试在 上执行此操作时sed,它不起作用。

$ sed 's/bbbb11.*?(?= )//' test
AllowedUsers [email protected] [email protected] [email protected] [email protected] .....

我也尝试过使用bbbb11.*?(?=[[:space:]]),它也不起作用。

我错过了什么?

答案1

Positive ( ?=) 和 Negative Lookahead ( ?!) 断言仅在支持的工具中才能正常工作PCRE 扩展。 GNUsed和 POSIX 都不支持这些库扩展。您需要perl开箱即用的支持

perl -pe 's/bbbb11.*?(?= )//'

或者,在没有正则表达式支持的情况下,您也可以很好地实现相同的目标。对于这种简单的替换,您可以执行以下操作,该操作在 POSIX 和 GNU 中都有效sed

sed 's/\(bbbb11[^ ]*\)//'

相关内容