如何在gVim/Vim中批量删除日志文件每行两单词间的内容?
解决方案
方法一:使用Vim替换命令(最推荐)
直接用substitute命令批量替换,既能删除中间内容,又能自动添加注释文本:
:%s/abc\s*\(.*\)\s*123/abc 123 --> remove \1 of line./g
%s:表示对所有行执行替换操作abc\s*\(.*\)\s*123:正则匹配规则,其中:abc:匹配目标前缀\s*:匹配任意数量的空白字符(空格、制表符都包含)\(.*\):捕获abc和123之间的所有内容(后续用\1引用这段内容)123:匹配目标后缀
- 替换后的字符串里,
\1会自动替换成捕获到的中间内容,直接生成你需要的注释文本。
如果只想处理包含abc和123的行(而非所有行),可以改成:
:g/abc.*123/s//abc 123 --> remove \1 of line./
方法二:Normal模式操作的批量版
如果习惯用Normal模式的编辑动作,可用以下命令批量处理:
:%normal! /abc<CR>w/123<CR>hdT1A --> remove <C-r>" of line.<Esc>
步骤拆解:
%normal!:对所有行执行Normal模式命令,!避免自定义映射干扰/abc<CR>:跳转到当前行的abc位置w:移动到abc后的第一个单词开头/123<CR>:跳转到当前行的123位置hdT1:删除abc到123之间的内容(h退到123前一个字符,dT1删到1字符之前)A --> remove <C-r>" of line.<Esc>:在行尾添加注释,<C-r>"会粘贴刚才删除的中间内容
你原有命令的问题
你用的:g/abc * 123/normal nD逻辑存在问题:
g命令匹配到目标行后,n是查找下一个匹配项,但当前行已经是匹配行,此时n大概率找不到内容,光标不会移动D是从光标位置删到行尾,根本没定位到abc和123之间的区域,自然达不到删除中间内容的效果
内容的提问来源于stack exchange,提问作者Sri
相关产品推荐
相关产品推荐

