我正在编辑包含以下行的HTML文档:
<h2>Table of Contents</h2>
和许多其他类似的线路。我的光标当前位于此行的开头。命令
:%s!<h2>(.+)</h2>!<h2><a name="#link">$1</a></h2>!g
引发
E486: Pattern not found: <h2>(.+)</h2>
如果我试图逃避捕获组的括号,或者甚至完全省略它们,结果是相似的:
:%s!<h2>\(.+\)</h2>!<h2><a name="#link">$1</a></h2>!g
E486: Pattern not found: <h2>\(.+\)</h2>
:%s!<h2>.+</h2>!<h2><a name="#link">$1</a></h2>!g
E486: Pattern not found: <h2>.+</h2>
有人能发现我做错了吗?
答案 0 :(得分:4)
你需要逃避+
。 Vim中的一个或多个量词是\+
,您正在搜索文字+
。后面的引用也是\
而不是$
所以你的替换字符串应该是:
:%s!<h2>\(.\+\)</h2>!<h2><a name="#link">\1</a></h2>!g
如果您在一行上有多个<h2>
标记,则此替换将是错误的。它将从第一个<h2>
的开头到最后一个</h2>
的结尾匹配。
要解决这个问题,你需要使用一个非贪婪的匹配,它将匹配尽可能少的字符而不是尽可能多的字符:
:%s!<h2>\(.\{-}\)</h2>!<h2><a name="#link">\1</a></h2>!g