在Vim中添加“/index.html”到路径

时间:2011-01-09 22:26:31

标签: regex vim

我正在尝试将“/index.html”附加到列表中的某些文件夹路径,如下所示:

path/one/
/another/index.html
other/file/index.html
path/number/two
this/is/the/third/path/
path/five
sixth/path/goes/here/

显然,只需要在尚不存在的地方添加文本。我可以用(vim命令)获得一些好的结果:

:%s/^\([^.]*\)$/\1\/index.html/

唯一的问题是,在运行此命令后,上一个示例中的第1行,第5行和第7行等行会以重复的斜杠结束。这也很容易解决,我所要做的就是搜索重复项并用一个斜线替换。

但问题是: 是不是有更好的方法可以立即获得正确的结果?

我是Vim的初学者,也不是正则表达的大师。任何提示都非常感谢!

谢谢!

2 个答案:

答案 0 :(得分:4)

非常接近:)

只需在正则表达式的末尾添加一个可选的斜杠:

\/\?

然后你需要将模式的其余部分更改为非贪婪匹配,以便忽略尾部斜杠。 vim中非贪婪匹配的语法(替换*)是:

\{-}

所以我们最终得到:

:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/

(为了安全而逃避这段时间并没有伤害。)

答案 1 :(得分:1)

Vim的正则表达式支持匹配一些文本foo的能力,如果它在其他文本bar之前或之后没有匹配bar之前或之后,那么这恰好是你正在寻找的东西。在这里,您希望将结尾与可选的/匹配,但前提是/后面没有index.html,然后将其替换为/index.html。快速浏览一下Vim的帮助告诉我\@<!正是要使用的内容。它告诉Vim前面的原子必须在文本中但不在匹配的内容中。通过一些实验,我得到了

:%s;/\?\(index\.html\)\@<!$;/index.html;
  1. 我使用;来分隔:s命令的各个部分,这样我就不必转义正则表达式或替换表达式中的任何/。在这种特殊情况下,这并不是什么大不了的事。

  2. /是可选的,我们会\?这样说。

  3. 我们需要将index.html组合在一起,否则我们的特殊\@<!只会影响l