在 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 或其他方法。