sed 或 perl 中 vim 的 \zs 是否有等价物?

nin*_*rod 12 vim sed perl regular-expression

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

:%s/funnyword\zs.*$/otherword/
Run Code Online (Sandbox Code Playgroud)

sed 甚至 perl 是否有等价物?

Mic*_*mer 16

在 Perl(和 PCRE)中,这可以通过零宽度的lookbehind 实现

(?<=funnyword).*$
Run Code Online (Sandbox Code Playgroud)

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

在任何最新版本的 Perl 中,\K几乎完全可以替代\zs您正在使用它:

funnyword\K.*$
Run Code Online (Sandbox Code Playgroud)

\K丢弃到目前为止匹配的所有内容,但从那时起继续匹配。前面的部分\K不必是固定长度的。这现在也在 PCRE 中,但我不确定它是什么版本。

\ze可以通过零宽度前瞻来实现,使用(?=...). 这种模式并不需要是固定长度。


因为 sed 使用POSIX BRE所以没有环视。但是,在这种情况下,您可以使用普通的捕获组轻松模拟它:

sed -e 's/\(funnyword\).*$/\1otherword/'
Run Code Online (Sandbox Code Playgroud)

您可以为积极的前瞻做同样的事情。如果您确实有更复杂的需求,则可能需要使用 Perl 或其他一些方法。