我想替换 vim 中的 html 标签,但重复使用我找到的内容。即我想替换
<div class="subSectionTitle">
Title 1
</div>
和
<h1>
Title 1
<h1>
我尝试使用s/pattern/replacement/
但不知怎的字符串没有插入。运行后
:%s/<div class="subSectionTitle">\_.\{-}<\/div>/<h1>\1<\/h1>/g
只得到
<h1></h1>
有人可以解释通配符在 vim 中的工作原理以及为什么这\1
不是我想要的文本吗?
答案1
- 只
.
匹配普通字符,但不匹配换行符。由于您的 HTML 标记跨越多行,因此没有匹配项。使用\_.
原子代替(:help /\_.
)。 \1
您在替换内部引用了内部文本,但实际上并没有捕获它。为此,请附上\(...\)
:- 这贪婪的匹配 via
*
将匹配第一的开始标记和最后的结束标签,捕获组中的其他标签将被吞噬,因此这只适用于单次出现。改变全部发生时,使用非贪婪*
通过替换为 来匹配\{-}
。 (或者使用第二种选择。)
:%s/<div class="subSectionTitle">\(\_.\{-}\)<\/div>/<h1>\1<\/h1>/g
或者,您可以分别匹配开始和结束标签。 (无论如何,即使原始的单个匹配也无法在嵌套标签的情况下替换相应的结束标签。)我没有捕获开始标签和结束标签的不同开头,而是通过特殊的开始实际匹配/\zs
原子。
:%s/<\zsdiv class="subSectionTitle">\|<\/zsdiv>/h1>/g