![sed 或 perl 中 vim 的 \zs 是否有等效项?](https://linux22.com/image/101842/sed%20%E6%88%96%20perl%20%E4%B8%AD%20vim%20%E7%9A%84%20%5Czs%20%E6%98%AF%E5%90%A6%E6%9C%89%E7%AD%89%E6%95%88%E9%A1%B9%EF%BC%9F.png)
在 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 或其他方法。