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