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

Vim如何复制、显示、高亮起止模式匹配行之间的任意长度内容

提取START与END标记间内容的通用方案

以下方案分为Vim内置操作和命令行工具两种场景,均可适配标记间任意行数的情况:

Vim 内操作

1. 直接显示所有区间内容

执行ex命令:

:g/START/+1,/END/-1 print

命令说明:

  • :g 为全局匹配命令,遍历所有含START的行
  • /START/+1,/END/-1 为范围定义,指代从START行下一行到END行上一行的所有内容
  • print 可缩写为p,执行后会在Vim底部依次打印所有匹配区间的内容

如果需要把结果导入新缓冲区编辑,可执行:

:new | 0put = execute('g/START/+1,/END/-1 p')

2. 复制所有区间内容到寄存器

如果要将内容追加到寄存器a,后续可直接粘贴使用,执行:

:g/START/+1,/END/-1 yank A

注意这里寄存器名A要大写,代表追加模式,避免每次匹配新区间时覆盖之前的内容。复制完成后用"ap即可粘贴所有提取的内容。
如果要直接复制到系统剪贴板,把寄存器名换成+即可:

:g/START/+1,/END/-1 yank +

3. 高亮所有区间内容

先自定义高亮样式:

:highlight Between ctermbg=yellow guibg=yellow

再执行匹配高亮:

:match Between /\%(START\_.\{-}\)\zs\_.\{-}\ze\_.\{-}END/

如果只是临时高亮查看,也可以用可视化选中所有区间:

:g/START/normal! V/END<CR>k

执行后所有区间都会被可视化选中,自带高亮效果。

命令行工具快速提取

如果不需要在Vim内操作,直接用命令行工具也可快速拿到结果:

sed 方案

sed -n '/START/,/END/{ /START/!{ /END/!p } }' 你的文件名

awk 方案

awk '/START/{f=1;next} /END/{f=0} f' 你的文件名

两种命令都会直接输出所有标记区间的中间内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:45:02