vi编辑器中如何批量替换

1. 基本替换命令

全局替换

" 在整个文件中替换(最常用)
:%s/old/new/g

" 替换时忽略大小写
:%s/old/new/gi

" 替换时需要确认每个替换
:%s/old/new/gc

在可视模式下替换

" 先进入可视模式选择文本,然后输入命令
:'<,'>s/old/new/g

2. 指定范围的替换

按行号范围替换

" 替换第10行到第20行
:10,20s/old/new/g

" 替换从当前行到文件末尾
:.,$s/old/new/g

" 替换从开头到第50行
:1,50s/old/new/g

使用标记替换

" 先在位置A标记为a,位置B标记为b
ma  " 在位置A标记为a
mb  " 在位置B标记为b

" 替换标记a到b之间的内容
:'a,'bs/old/new/g

3. 使用正则表达式的高级替换

基本正则表达式

" 替换以hello开头的行
:%s/^hello/new/g

" 替换以world结尾的行
:%s/world$/new/g

" 替换所有数字
:%s/\d\+/number/g

" 替换多个空格为单个空格
:%s/\s\+/ /g

分组和反向引用

" 交换两个单词的顺序(使用\1, \2等引用分组)
:%s/\(\w\+\) \(\w\+\)/\2 \1/g

" 在匹配内容前后添加内容
:%s/pattern/prefix_&_suffix/g  " &代表匹配的整个内容

4. 特殊字符的替换

处理特殊字符

" 替换包含斜杠的路径(使用其他分隔符避免转义)
:%s#/old/path#/new/path#g

" 或者转义特殊字符
:%s/\/old\/path/\/new\/path/g

" 替换制表符
:%s/\t/    /g  " 替换为4个空格

" 替换换行符(需要特殊处理)
:%s/\n/\r/g    " 在替换中使用\r表示换行

5. 批量替换的实用技巧

确认替换模式

" 每个替换前确认(非常有用)
:%s/old/new/gc

确认选项:

  • y:替换当前匹配
  • n:跳过当前匹配
  • a:替换所有剩余匹配
  • q:退出替换
  • l:替换当前匹配后退出

大小写敏感控制

" 忽略大小写
:%s/old/new/gi

" 智能大小写(遵循搜索模式)
:%s/old/new/gI

" 在命令前设置忽略大小写
:set ignorecase
:%s/old/new/g
:set noignorecase

6. 跨文件批量替换

在多个文件中替换

# 在vim外使用sed(Linux命令)
sed -i 's/old/new/g' *.txt

# 或者使用vim的批处理模式
vim -c '%s/old/new/g' -c 'wq' file1.txt file2.txt

在Vim中编辑多个文件

" 打开多个文件
:args *.txt

" 在所有参数文件中执行替换
:argdo %s/old/new/g | update

" 或者只在包含特定模式的文件中替换
:argdo if search('old') | %s/old/new/g | update | endif

7. 实用的批量替换示例

代码重构示例

" 重命名变量(确保单词边界)
:%s/\<oldVar\>/newVar/g

" 更改函数调用格式
:%s/function_name(\([^)]*\))/new_function(\1)/g

" 添加日志语句
:g/error/s/^/console.log("Error: ") /g

文本格式化示例

" 删除行尾空白
:%s/\s\+$//g

" 规范化空格
:%s/  \+/ /g

" 在每行结尾添加分号
:%s/$/;/

8. 撤销和重做替换

" 撤销最后一次替换
u

" 重做被撤销的替换
Ctrl + r

" 查看替换历史
:changes

9. 安全替换的最佳实践

先预览再替换

" 先查看所有匹配项
:/old

" 或者高亮显示所有匹配
:set hlsearch
/old

" 确认无误后再替换
:%s/old/new/g

备份原始文件

" 在替换前保存备份
:w backup_filename

" 或者使用Vim的备份功能
:set backup
:set backupdir=~/vim_backups

10. 高级批量处理技巧

使用宏进行复杂替换

" 录制宏完成复杂替换
qa           " 开始录制到寄存器a
/old<CR>     " 查找目标
cwnew<Esc>   " 替换单词
n            " 查找下一个
q            " 停止录制

" 执行宏多次
100@a        " 执行100次

结合外部命令

" 使用外部命令处理选中的文本
:'<,'>!sed 's/old/new/g'

" 排序选中的行
:'<,'>!sort

Comments

No comments yet. Why don’t you start the discussion?

发表回复