Vim 搜索替换正则表达式如果是这个,不是那个,不是那个

Vim Search Replace Regexp If this, not that, and not that

我有一个页面,我正在尝试使用正则表达式修复指向该页面的大量链接。

例如。有些东西已经被替换了,它们像 href="/websites/site.." 一样在那里,所以那些我一个人留下。然而,有些被从绝对替换为相对,但我得到的脚本认为我正在更改的文件位于 Web 根目录中,它们是..所以当我得到像 href="/file" 这样的匹配时,我想匹配。任何人。这是我正在使用的正则表达式

%s#\v(href\="/)&((href\="/websites)@!|(href\="//)@!)#href="/websites/site/#g

但是,它会像这样更改一组条目

<a href="/websites/site/websites/site/dog.html"> 
<a href="/websites/site//">
<a href="doghouse.html">
<a href="/websites/site/doghouse.html">

至此

<a href="/websites/site/href="/websites/site/websites/site/dog.html">
<a href="/websites/site/href="/websites/site//">
<a href="doghouse.html">
<a href="/websites/site/href="/websites/site/doghouse.html">

如能帮助我们正确使用 search/replace vim 正则表达式,我们将不胜感激。

谢谢

你可以用 :help :global 来完成。根据您的解释,我不完全确定您要做什么,但您可以使用此命令排除带有“网站”的行,如下所示::g!'href="/websites/site/'s/LESS_COMPLICATED_REGEX/RESULT/

这里我使用 :g! 在所有与 '' 中的正则表达式不匹配的行上执行命令(您可以像往常一样使用 / 而不是 ' ).要执行的命令是常用的 :s 但在这里您不必担心它会 运行 在具有“网站”字符串的行上。

好的,开始吧! :%s/\vhref\="\/(\/|websites)@!/href="\/websites\/site

说明: 您要更改的所有字符串都以 href="/ 开头,因此将其作为文字包含似乎是正确的调用。

然后,您要确保文字“websites”和“/”都不存在,以便与 (\/|website)@! 一起使用,然后,您想要用新添加的内容更改它,所以剩下的是必需的。