Regex 将“/index.html”添加到Vim中的路径
我正在尝试将/index.html附加到列表中的某些文件夹路径,如下所示:Regex 将“/index.html”添加到Vim中的路径,regex,vim,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/ 唯一的问题是,在运行此命令后,
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初学者,也不是正则表达式大师。任何提示都非常感谢
谢谢 非常接近:
只需在正则表达式的末尾添加一个可选的斜杠:
\/\?
然后,您需要将模式的其余部分更改为非贪婪匹配,以便忽略尾随斜杠。替换*的vim中非贪婪匹配的语法为:
\{-}
因此,我们最终得出以下结论:
:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/
为了安全和逃离这段时间不会有任何伤害。非常接近:
只需在正则表达式的末尾添加一个可选的斜杠:
\/\?
然后,您需要将模式的其余部分更改为非贪婪匹配,以便忽略尾随斜杠。替换*的vim中非贪婪匹配的语法为:
\{-}
因此,我们最终得出以下结论:
:%s/^\([^\.]\{-}\)\/\?$/\1\/index.html/
确保安全并逃过这段时间并没有什么坏处。Vim的正则表达式支持匹配一点文本foo的功能,如果它在没有匹配条的情况下在其他文本条之前或之后出现或没有出现,这正是您要找的。在这里,您希望将行的结尾与可选的/匹配,但前提是/后面没有index.html,然后将其替换为/index.html。快速查看Vim的帮助告诉我\@正是要使用的。它告诉Vim前面的原子必须在文本中,但不在匹配的内容中。通过一些实验,我得到了
:%s;/\?\(index\.html\)\@<!$;/index.html;
我用;分隔:s命令的各个部分,以便不必转义正则表达式或替换表达式中的任何/。在这种特殊情况下,这并不是什么大问题
/是可选的,我们用\?来表示
我们需要将index.html分组在一起,否则我们的特殊\@只会影响l
Vim的正则表达式支持匹配一点文本foo的能力,如果它在没有匹配条的其他文本条之前或之后出现或不出现,那么这正是您要查找的类型。在这里,您希望将行的结尾与可选的/匹配,但前提是/后面没有index.html,然后将其替换为/index.html。快速查看Vim的帮助告诉我\@正是要使用的。它告诉Vim前面的原子必须在文本中,但不在匹配的内容中。通过一些实验,我得到了
:%s;/\?\(index\.html\)\@<!$;/index.html;
我用;分隔:s命令的各个部分,以便不必转义正则表达式或替换表达式中的任何/。在这种特殊情况下,这并不是什么大问题
/是可选的,我们用\?来表示
我们需要将index.html分组在一起,否则我们的特殊\@只会影响l
非常感谢安德鲁!您的解释很好,而且效果完美。现在是使用\v标志和非/分隔符以提高可读性的理想时机。:%s@\v^[^.]{-}/?$@\1/索引。html@Thanks很多,安德鲁!您的解释很好,而且效果完美。现在是使用\v标志和非/分隔符以提高可读性的理想时机。:%s@\v^[^.]{-}/?$@\1/index.html@