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
相关产品推荐
相关产品推荐

