如何在VIM中提取多行点分隔符间的第二个单词并批量复制粘贴?
无插件VIM批量提取点分隔的第二个单词方法
原文本示例:
1 somename.xyz.something 2 so.someday.zzzz 3 text.example.fese.efsse
预期提取结果:
5 xyz 6 someday 7 example
下面是几种无需插件的高效方法:
方法一:替换命令直接生成目标内容
这是最快捷的方式,适合直接修改或复制提取结果:
- 用可视模式选中需要处理的所有行(比如
ggVG选中全文,或v拖动选中目标行) - 执行替换命令:
命令解释:匹配每行中第一个点和第二个点之间的内容(:'<,'>s/^.*\.\([^.]*\)\..*/\1/g\([^.]*\)捕获第二个单词),将整行替换为捕获到的内容 - 选中修改后的行,按
y复制,跳转到目标位置按p粘贴即可 - 若不想修改原文本,可先复制原行到目标位置,再对复制的行执行上述替换命令
方法二:宏录制批量提取
适合需要保留原文本,逐行提取的场景:
- 光标定位到第一行开头
- 按
qq开始录制宏(q后接寄存器名,这里用q) - 依次执行:
f.:跳到第一个点的位置l:向右移动一个字符(跳过第一个点)t.:跳到第二个点的前一个字符"Ay:将选中的内容追加到寄存器a(避免覆盖)j:跳到下一行开头
- 按
q停止录制 - 执行
2@q(数字是剩余行数)批量提取所有行的第二个单词 - 跳转到目标位置,按
"ap粘贴寄存器a中的内容
方法三:全局命令批量提取
无需手动选中,直接对所有行执行提取操作:
- 先清空寄存器a(避免残留内容):
qaq - 执行全局命令,将每行的第二个单词追加到寄存器a:
:g/^/normal! f.lt."Ay - 跳转到目标位置,按
"ap粘贴提取的内容
内容的提问来源于stack exchange,提问作者Alwin Brauns
相关产品推荐
相关产品推荐

