sed 或 perl 中 vim 的 \zs 是否有等效项?

sed 或 perl 中 vim 的 \zs 是否有等效项?

在 vim 中,我们可以使用\zs原子来表示“比赛真正从这里开始”:

:%s/funnyword\zs.*$/otherword/

sed 甚至 perl 有等效的吗?

答案1

在 Perl(和 PCRE)中,这可以通过以下方式实现零宽度回顾

(?<=funnyword).*$

它匹配“funnyword”,但不会将其作为匹配的一部分。这些仅适用于后视中的固定长度文本。您还可以使用负向后查找 ( (?<!...)) 来指定某些文本不存在。

在 Perl 的任何最新版本中,\K几乎完全替代\zs当你使用它时:

funnyword\K.*$

\K丢弃迄今为止匹配的所有内容,但从该点开始继续匹配。前面的部分\K不必是固定长度的。这是现在也在 PCRE 中,但我不确定它是什么版本。

\ze可以通过零宽度前瞻来实现,使用(?=...).那个图案需要是固定长度的。


因为 sed 使用POSIX BRE,没有环顾四周。不过,在这种情况下,您可以使用普通的捕获组相当轻松地模拟它:

sed -e 's/\(funnyword\).*$/\1otherword/'

您可以对积极的前瞻执行相同的操作。如果您确实有更复杂的需求,您可能需要考虑 Perl 或其他方法。

相关内容