如何在VIM中删除无内容标签对及指定标签对(保留内部内容)
嘿,这两个在VIM里处理HTML标签的需求我太熟悉了,给你分享几个实用的解决方案:
1. 删除内部无内容的标签对
这里的“无内容”包括完全空的标签(比如<span></span>)和中间只有空白字符的标签(比如<div> </div>),分两种场景处理:
单行空标签对
如果空标签对都在同一行,直接用正则替换命令就能批量处理:
:%s/<\(\w\+\)>\s*<\/\1>//g
解释下这个命令的细节:
%表示作用于所有行<\(\w\+\)>匹配开始标签,并用\1捕获标签名(比如span、div)\s*匹配标签中间的任意空白字符(空格、制表符都算)<\/\1>匹配对应的结束标签(\1复用前面捕获的标签名,保证标签对匹配)//替换成空,也就是删掉整个标签对g表示每行匹配多次
跨行空标签对
如果空标签对是跨行的(比如开始标签在一行,结束标签在下一行,中间只有空白),可以用VIM的“very magic”模式简化正则,配合\_.匹配任意字符(包括换行):
:%s/\v<(\w+)>\s*\_.{-}\s*<\/\1>//g
\v开启very magic模式,减少转义符,写正则更顺手\_.匹配任意字符(包括换行){-}非贪婪匹配,避免误匹配到其他标签对
2. 删除指定标签对(如
<p>)并保留内部内容 针对你给出的例子:
text
要变成:
text
同样分原生方法和插件辅助方法:
原生正则替换(推荐)
用非贪婪捕获内部内容,替换掉<p>和</p>标签:
:%s/<p>\s*\(.\{-}\)\s*<\/p>/\1/g
解释:
<p>匹配开始的p标签\s*匹配标签前后的空白(避免替换后留下多余空格)\(.\{-}\)非贪婪捕获p标签内部的所有内容(这里就是<b>text</b>)<\/p>匹配结束的p标签\1把捕获的内部内容放回去,实现“保留内容删除标签”
如果p标签是跨行的,同样把.换成\_.即可:
:%s/<p>\s*\(\_.\{-}\)\s*<\/p>/\1/g
手动操作(适合单个标签对)
如果只是处理这一个标签对,手动操作更直观:
- 把光标移到
<p>的<字符上,按dt>删除从光标到>的内容(也就是删掉<p) - 按
f<找到后面</p>的<字符 - 按
dT>删除从光标到前面>的内容(也就是删掉</p)
这样就刚好保留了中间的<b>text</b>
插件辅助(更高效的批量处理)
如果你经常处理HTML/XML标签,推荐安装tpope/vim-surround插件,它专门处理环绕内容的符号:
- 把光标移到p标签内部的任意位置
- 按
ds<p>(或者直接dsp,插件会自动识别最近的标签对),就能直接删除p标签对并保留内部内容
内容的提问来源于stack exchange,提问作者cdxf
相关产品推荐
相关产品推荐

