Vim 替换命令完整学习笔记
文章目录
- [Vim 替换命令完整学习笔记](#Vim 替换命令完整学习笔记)
-
- [1. 核心概念](#1. 核心概念)
- [2. 替换命令基本语法](#2. 替换命令基本语法)
-
- [2.1 基本格式](#2.1 基本格式)
- [2.2 分隔符选择](#2.2 分隔符选择)
- [2.3 范围指定](#2.3 范围指定)
- [3. 替换标志详解](#3. 替换标志详解)
-
- [3.1 基础标志](#3.1 基础标志)
- [3.2 高级标志](#3.2 高级标志)
- [3.3 标志组合](#3.3 标志组合)
- [4. 正则表达式在替换中的应用](#4. 正则表达式在替换中的应用)
-
- [4.1 基础正则表达式](#4.1 基础正则表达式)
- [4.2 字符类和量词](#4.2 字符类和量词)
- [4.3 分组和引用](#4.3 分组和引用)
- [5. 实用替换场景](#5. 实用替换场景)
-
- [5.1 文本清理](#5.1 文本清理)
- [5.2 代码重构](#5.2 代码重构)
- [5.3 格式转换](#5.3 格式转换)
- [5.4 批量修改](#5.4 批量修改)
- [6. 查找命令](#6. 查找命令)
-
- [6.1 基础查找](#6.1 基础查找)
- [6.2 高级查找技巧](#6.2 高级查找技巧)
- [7. 命令速查表](#7. 命令速查表)
- [8. 实用技巧和最佳实践](#8. 实用技巧和最佳实践)
- [9. 学习建议](#9. 学习建议)
1. 核心概念
Vim 的替换命令是其最强大的功能之一,基于强大的正则表达式系统,可以进行精确的文本查找和替换操作。
核心特点:
- 强大的正则表达式支持:支持复杂的模式匹配
- 灵活的范围控制:可以指定替换的行范围
- 多种替换模式:支持全局、确认、大小写敏感等多种模式
- 自定义分隔符:避免与模式中的字符冲突
基本思路:
- 精确定义要查找的模式
- 指定替换的内容
- 选择适当的替换标志
- 确定操作范围
2. 替换命令基本语法
2.1 基本格式
vim
:[range]s/{pattern}/{replacement}/{flags}
语法组成:
-
[range]
- 操作范围(可选) -
s
- substitute 替换命令 -
{pattern}
- 要查找的模式 -
{replacement}
- 替换内容 -
{flags}
- 替换标志(可选)
2.2 分隔符选择
vim
" 标准分隔符
:%s/old/new/g
" 自定义分隔符(避免冲突)
:%s#old#new#g
:%s@old@new@g
:%s{old}{new}g
:%s|old|new|g
💡 分隔符选择原则 :当模式中包含
/
字符时,使用其他分隔符避免转义
2.3 范围指定
vim
:s/old/new/g " 当前行
:%s/old/new/g " 全文件
:1,10s/old/new/g " 第1-10行
:10,30s/old/new/g " 第10-30行
:.,+5s/old/new/g " 当前行及下5行
:.-2,.s/old/new/g " 当前行前2行到当前行
:10,$s/old/new/g " 第10行到文件末尾
:'<,'>s/old/new/g " 可视选择的范围
3. 替换标志详解
3.1 基础标志
-
g
- 全局替换(替换行内所有匹配) -
c
- 确认替换(每次替换前询问) -
i
- 忽略大小写 -
I
- 大小写敏感(默认行为)
3.2 高级标志
-
n
- 只统计匹配数量,不执行替换 -
p
- 打印包含替换的行 -
l
- 打印包含替换的行(显示特殊字符) -
e
- 忽略错误(找不到模式时不报错)
3.3 标志组合
vim
:%s/pattern/replacement/gc " 全局替换 + 确认
:%s/pattern/replacement/gi " 全局替换 + 忽略大小写
:%s/pattern/replacement/gci " 全局 + 确认 + 忽略大小写
:%s/pattern/replacement/gn " 全局统计(不替换)
4. 正则表达式在替换中的应用
4.1 基础正则表达式
vim
" 字符匹配
:%s/./X/g " 任意字符替换为X
:%s/^/# /g " 行首添加注释符
:%s/$/ END/g " 行尾添加END
" 转义字符
:%s/\./DOT/g " 字面意义的点号
:%s/\*/STAR/g " 字面意义的星号
:%s/\\/BACKSLASH/g " 反斜杠
4.2 字符类和量词
vim
" 字符类
:%s/\d/N/g " 数字替换为N
:%s/\w/C/g " 字母数字替换为C
:%s/\s/ /g " 空白字符规范化为空格
:%s/\D/X/g " 非数字替换为X
" 量词
:%s/\d\+/NUM/g " 一个或多个数字
:%s/\w*/WORD/g " 零个或多个字母
:%s/\s\{2,}/ /g " 多个空格替换为两个空格
:%s/\d\{4}/YEAR/g " 恰好4个数字替换为YEAR
4.3 分组和引用
vim
" 基础分组
:%s/\(abc\)\(def\)/\2\1/g " 交换abc和def
:%s/\(\w\+\)\s\+\(\w\+\)/\2 \1/g " 交换两个单词
:%s/\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)/\3\/\2\/\1/g " 日期格式转换
" 复杂分组
:%s/\(\w\+\)=\(\w\+\)/\1: "\2"/g " key=value 转为 key: "value"
:%s/\(.*\):\(.*\)/\2 -> \1/g " 冒号分隔格式转换
5. 实用替换场景
5.1 文本清理
vim
" 删除行尾空白
:%s/\s*$//g
:%s#\s*$##g
" 删除空行
:%s/^$//g
:g/^$/d " 更好的方法
" 规范化空白
:%s/\s\+/ /g " 多个空格合并为一个
:%s/\t/ /g " Tab替换为4个空格
:%s/\r//g " 删除Windows换行符
5.2 代码重构
vim
" 批量注释
:10,19s/^/# /g " 添加井号注释
:%s/^/\/\/ /g " 添加双斜杠注释
:%s/^/<!-- /g | %s/$/ -->/g " HTML注释(需要两步)
" 取消注释
:%s/^# //g " 删除井号注释
:%s/^\/\/ //g " 删除双斜杠注释
" 变量重命名
:%s/\<oldVar\>/newVar/g " 精确匹配变量名
:%s/\bfunction_old\b/function_new/g " 函数名替换
" 字符串格式转换
:%s/'\([^']*\)'/"\1"/g " 单引号转双引号
:%s/"\([^"]*\)"/'\1'/g " 双引号转单引号
5.3 格式转换
vim
" 数据格式转换
:%s/\(\w\+\),\(\w\+\)/\2 \1/g " CSV列交换
:%s/\(\d\{4}\)-\(\d\{2}\)-\(\d\{2}\)/\2\/\3\/\1/g " 日期格式
" HTML/XML处理
:%s/<[^>]*>//g " 删除所有HTML标签
:%s/</</g " HTML实体转换
:%s/>/>/g
:%s/&/\&/g
" URL处理
:%s/http:/https:/g " HTTP转HTTPS
:%s/\(https\?:\/\/\)\([^\/]*\)/\2/g " 提取域名
5.4 批量修改
vim
" 版本号替换
:%s/BUFV[1-8]/BUFV12/g " 范围替换
:%s/BUFV\(9\|1[0-6]\)/BUFV16/g " 复杂范围
" 文件路径处理
:%s/\\/\//g " Windows路径转Unix
:%s/\/\//\\/g " Unix路径转Windows
" 配置文件修改
:%s/^#\s*\(.*\)/\1/g " 取消配置注释
:%s/=\s*\(.*\)/= "\1"/g " 值加引号
6. 查找命令
6.1 基础查找
vim
" 向前查找
/pattern " 查找pattern
/140P7T\d\w* " 查找以140P7T开头的特定模式
/\<word\> " 精确匹配单词
" 向后查找
?pattern " 向上查找pattern
?ERROR " 向上查找ERROR
" 查找控制
n " 下一个匹配
N " 上一个匹配
* " 查找当前单词(向前)
# " 查找当前单词(向后)
6.2 高级查找技巧
vim
" 大小写控制
/pattern\c " 忽略大小写查找
/pattern\C " 大小写敏感查找
" 增量查找
:set incsearch " 启用增量查找
:set hlsearch " 高亮搜索结果
:nohlsearch " 清除高亮
" 查找历史
/<Up> " 查找历史上一个
/<Down> " 查找历史下一个
q/ " 打开查找历史窗口
7. 命令速查表
命令 | 作用描述 | 举例 |
---|---|---|
基础替换 | ||
:%s/old/new/g |
全文件替换所有old为new | :%s/hello/hi/g |
:10,19s/^/#/g |
第10-19行行首添加# | 批量注释代码 |
:%s/pattern//g |
删除所有匹配的pattern | :%s/ADRN.*//g |
范围替换 | ||
:s/old/new/ |
当前行第一个匹配 | 单行单次替换 |
:s/old/new/g |
当前行所有匹配 | 单行全部替换 |
:1,$s/old/new/g |
全文件替换 | 等同于:%s |
:.,+5s/old/new/g |
当前行及下5行 | 范围替换 |
正则表达式替换 | ||
:%s/\d\{4\}/YEAR/g |
4位数字替换为YEAR | :%s/2023/YEAR/g |
:%s/BUFV[1-8]/BUFV12/g |
BUFV1-8替换为BUFV12 | 范围字符替换 |
`:%s/BUFV\(9 | 1[0-6])/BUFV16/g` | 复杂范围替换 |
:%s/\(abc\)\(def\)/\2\1/g |
分组交换 | abcdef → defabc |
文本清理 | ||
:%s/\s*$//g |
删除行尾空白 | 清理多余空格 |
:%s#\s*$##g |
删除行尾空白(#分隔符) | 避免分隔符冲突 |
:%s/\s\+/ /g |
多个空格合并为一个 | 规范化空白 |
:%s/\t/ /g |
Tab替换为4个空格 | 统一缩进格式 |
特殊位置操作 | ||
:%s/^/# /g |
所有行首添加"# " | 批量注释 |
:%s/$/ END/g |
所有行尾添加" END" | 批量添加后缀 |
:%s/$/\/CLK/g |
行尾添加"/CLK" | :%s/$/\/CLK/g |
替换标志 | ||
:%s/old/new/gc |
全局替换+确认 | 逐个确认替换 |
:%s/old/new/gi |
全局替换+忽略大小写 | 不区分大小写 |
:%s/old/new/gn |
统计匹配数量 | 只计数不替换 |
自定义分隔符 | ||
:%s#pattern#replacement#g |
使用#作为分隔符 | :%s#foo/bar#baz/qux#g |
:%s@pattern@replacement@g |
使用@作为分隔符 | 避免/字符冲突 |
:%s{pattern}{replacement}g |
使用{}作为分隔符 | 处理复杂路径 |
查找命令 | ||
/pattern |
向前查找 | /140P7T\d\w* |
?pattern |
向后查找 | ?ERROR |
/pattern\c |
忽略大小写查找 | 不区分大小写 |
* |
查找当前单词 | 快速查找光标下单词 |
命令 | 作用描述 | 举例 |
---|---|---|
:%s/ADRN.*// 或:%s#ADRN.*## |
用于替换当前文件中所有行中以ADRN 开头的部分。删除该部分及其后所有字符,直到行尾。# 和/ 都可以作为分隔符。 |
:%s/ADRN.*// 或:%s#ADRN.*## |
:10,19s/^/#/g |
在第 10 行到第 19 行的每行行首加上# ,即添加注释符号,常用于注释代码。 |
:10,19s/^/#/g |
/140P7T\d\w* |
查找匹配140P7T 后跟一个数字和后续字母数字组合的字符串。\d 匹配数字,\w* 匹配零个或多个字母或数字。 |
/140P7T\d\w* |
`:%s/BUFV\(9 | 1[0-6])/BUFV16/g` | 将文件中所有的BUFV9 或BUFV1 后跟1到6 的数字替换为BUFV16 。通过正则表达式`\(9 |
:%s/BUFV[1-8]/BUFV12/g |
将文件中所有的BUFV1 到BUFV8 替换为BUFV12 。 |
:%s/BUFV[1-8]/BUFV12/g |
:%s#\s*$##g |
删除每行行尾的空格。 | :%s#\s*$##g |
:%s{模式}{替换内容} |
替换整个文件中的模式,匹配到的内容被替换为指定的内容。 | :%s/ADRN.*// |
:10,19s{模式}{替换内容} |
替换第 10 行到第 19 行范围内匹配的模式,替换为指定内容。 | :10,19s/^/#/g |
:%s{模式}{替换内容}{g} |
替换整个文件中所有匹配模式的内容,不管它出现多少次。 | :%s/BUFV[1-8]/BUFV12/g |
:%s{模式}{替换内容}{c} |
替换匹配模式的内容时,每次都会进行确认,适用于需要用户逐步确认的情况。 | :%s/\d\{4\}/YEAR/g |
:%s{模式}{替换内容}{i} |
忽略大小写进行替换。 | :%s/abc/XYZ/i |
:%s{模式}{替换内容}{gc} |
替换每个匹配的内容时要求确认(类似c 选项),并且对所有匹配项执行全局替换。 |
:%s/\d\{4\}/YEAR/gc |
:%s{.*\s$}{//} |
删除每行末尾的空白字符(空格、Tab)。 | :%s/\s*$//g |
:/{模式}/ |
查找下一个匹配模式的地方,并将光标移动到该位置。 | /140P7T\d\w* |
:?{模式}/ |
查找上一个匹配模式的地方,并将光标移动到该位置。 | ?ERROR |
:%s{模式}{替换内容}{n} |
查找并替换模式,返回替换的数量。 | :%s/abc/def/n |
:%s{\(模式\)}{替换内容}{g} |
在替换过程中使用正则表达式组。括号用于分组匹配。 | :%s/\(abc\)\(def\)/\2\1/g |
:%s#模式#替换内容# |
使用自定义的分隔符(如# )代替默认的/ ,通常用于避免分隔符与模式中的字符冲突。 |
:%s#foo/bar#baz/qux# |
:%s{模式}{替换内容}{g} (不加g ) |
替换每行中第一次匹配的模式。 | :%s/foo/bar/ |
:%s{模式}{替换内容}{g} (加g ) |
替换每行中所有匹配模式的内容。 | :%s/\d\{4\}/YEAR/g |
:%s{模式}{替换内容} (使用正则表达式) |
使用正则表达式进行模式匹配并替换。 | :%s/\d\{4\}/YEAR/g |
:%s#$#/CLK# |
使用# 作为分隔符替换行尾的# 为CLK# 。 |
:%s#$#/CLK# |
:%s/$/\/CLK/ |
使用默认分隔符/ 来替换每行行尾,添加\CLK 。 |
:%s/$/\/CLK/ |
8. 实用技巧和最佳实践
替换策略
- 先查找后替换 :使用
/pattern
确认模式正确 - 小范围测试:先在小范围内测试复杂替换
- 使用确认模式 :重要替换使用
gc
标志逐个确认 - 备份重要数据:大批量替换前备份文件
正则表达式技巧
vim
" 非贪婪匹配的模拟
:%s/.*\ze pattern/replacement/ " 使用\ze向前预查
" 条件替换
:%s/\(pattern1\)\|pattern2/\1FOUND/g " 只替换pattern1
" 复杂分组
:%s/\v(\w+)\s*=\s*(\w+)/\1: "\2"/g " 使用very magic模式
" 大小写转换
:%s/\<\w/\U&/g " 单词首字母大写
:%s/.*/\U&/g " 整行大写
:%s/.*/\L&/g " 整行小写
高效工作流程
vim
" 1. 设置搜索选项
:set hlsearch incsearch
" 2. 先查找确认
/your_pattern
" 3. 替换操作
:%s//replacement/gc
" 4. 清除高亮
:nohlsearch
常用配置
vim
" .vimrc 中的实用配置
set hlsearch " 高亮搜索结果
set incsearch " 增量搜索
set ignorecase " 默认忽略大小写
set smartcase " 智能大小写(包含大写时敏感)
" 快捷键映射
nnoremap <leader>h :nohlsearch<CR> " 快速清除高亮
nnoremap <leader>s :%s//gc<Left><Left><Left> " 快速替换
复杂场景处理
vim
" 多行模式匹配
:%s/pattern\_.*end_pattern/replacement/g
" 跨行替换
:%s/\n/,/g " 换行符替换为逗号
" 条件替换
:g/condition/s/pattern/replacement/g " 只在匹配行中替换
" 排除特定行
:g!/exclude_pattern/s/pattern/replacement/g
9. 学习建议
循序渐进的学习路径
-
第一阶段:掌握基础替换
- 熟练使用
:%s/old/new/g
基本格式 - 理解范围指定和基础标志
- 熟练使用
-
第二阶段:学习正则表达式
- 掌握基础字符类
\d
,\w
,\s
- 学习量词
*
,+
,{n,m}
- 掌握基础字符类
-
第三阶段:高级正则应用
- 理解分组和引用
\(pattern\)
,\1
- 学习复杂模式匹配
- 理解分组和引用
-
第四阶段:实际场景应用
- 在代码重构中使用替换
- 处理数据格式转换任务
实践建议
- 创建测试文件:准备各种格式的文本进行练习
- 记录常用模式:建立个人的替换模式库
- 结合其他命令 :与
:g
,:v
命令结合使用 - 学习vim正则:理解Vim正则与其他工具的差异
避免常见错误
- 忘记使用
g
标志导致只替换第一个匹配 - 分隔符与模式中的字符冲突
- 不理解分组引用的编号
- 在重要文件上直接执行复杂替换
进阶技巧
vim
" 使用表达式寄存器
:%s/pattern/\=expression/g
" 函数调用替换
:%s/\(\w\+\)/\=toupper(submatch(1))/g
" 宏与替换结合
:let @a='替换命令序列'
:normal @a
📝 核心提示:Vim的替换命令是文本处理的利器,掌握好正则表达式和分组引用是关键。记住"先查找,后替换,多测试,备份文件"的安全原则!