我正在尝试将“/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的初学者,也不是正则表达的大师。任何提示都非常感谢!
谢谢!
答案 0 :(得分:4)
非常接近:)
只需在正则表达式的末尾添加一个可选的斜杠:
\/\?
然后你需要将模式的其余部分更改为非贪婪匹配,以便忽略尾部斜杠。 vim中非贪婪匹配的语法(替换*)是:
\{-}
所以我们最终得到:
:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/
(为了安全而逃避这段时间并没有伤害。)
答案 1 :(得分:1)
Vim的正则表达式支持匹配一些文本foo
的能力,如果它在其他文本bar
之前或之后没有匹配bar
之前或之后,那么这恰好是你正在寻找的东西。在这里,您希望将结尾与可选的/
匹配,但前提是/
后面没有index.html
,然后将其替换为/index.html
。快速浏览一下Vim的帮助告诉我\@<!
正是要使用的内容。它告诉Vim前面的原子必须在文本中但不在匹配的内容中。通过一些实验,我得到了
:%s;/\?\(index\.html\)\@<!$;/index.html;
我使用;
来分隔:s
命令的各个部分,这样我就不必转义正则表达式或替换表达式中的任何/
。在这种特殊情况下,这并不是什么大不了的事。
/
是可选的,我们会\?
这样说。
我们需要将index.html
组合在一起,否则我们的特殊\@<!
只会影响l
。