You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

手动操作(适合单个标签对)

如果只是处理这一个标签对,手动操作更直观:

  1. 把光标移到<p>的<字符上,按dt> 删除从光标到>的内容(也就是删掉<p)
  2. 按f< 找到后面</p>的<字符
  3. 按dT> 删除从光标到前面>的内容(也就是删掉</p)
    这样就刚好保留了中间的<b>text</b>

插件辅助(更高效的批量处理)

如果你经常处理HTML/XML标签,推荐安装tpope/vim-surround插件,它专门处理环绕内容的符号:

  1. 把光标移到p标签内部的任意位置
  2. 按ds<p> (或者直接dsp,插件会自动识别最近的标签对),就能直接删除p标签对并保留内部内容

内容的提问来源于stack exchange,提问作者cdxf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:20:58