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


11

在vim中,我们可以使用\zs原子说“真的在这里开始比赛”:

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

sed或什至perl是否等效?

Answers:


15

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

(?<=funnyword).*$

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

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

funnyword\K.*$

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

\ze可以使用零宽度的超前功能来实现(?=...)。该模式不需要固定长度。


因为sed使用POSIX BRE所以没有环顾四周。但是,在这种情况下,您可以使用普通的捕获组轻松地对其进行仿真:

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

您也可以这样做,以实现积极的前瞻性。如果您确实有更复杂的要求,则可能需要使用Perl或其他方法。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.