Vim 里最常用的查找替换命令是 :s,也就是 substitute。它可以只替换当前行,也可以替换整个文件,还可以逐个确认,适合批量修改配置文件里的 IP、域名、路径和变量名。
基本格式
Vim 替换命令的基本格式是:
:[范围]s/查找内容/替换内容/[标志]常见写法:
:s/foo/bar/表示只在当前行,把第一个 foo 替换成 bar。
:s/foo/bar/g表示只在当前行,把所有 foo 都替换成 bar。
:%s/foo/bar/g表示在整个文件里,把所有 foo 都替换成 bar。
这里的 % 表示整个文件范围,等价于 1,$。
替换整个文件里的 IP 地址
如果要把当前文件中的 8.8.8.8 全部替换成 10.20.20.29,不要直接写:
:%s/8.8.8.8/10.20.20.29/g这条命令看起来直观,但在 Vim 正则里,. 表示“任意一个字符”,不是普通点号。更稳妥的写法是把点号转义:
:%s/8\.8\.8\.8/10.20.20.29/g这样才是精确匹配 8.8.8.8。
每次替换前都确认
如果担心误替换,可以加 c 标志,让 Vim 每次替换前都询问:
:%s/8\.8\.8\.8/10.20.20.29/gc提示时常见按键含义:
| 按键 | 作用 |
|---|---|
y | 替换当前匹配项 |
n | 跳过当前匹配项 |
a | 替换剩余所有匹配项 |
q | 退出替换 |
l | 替换当前项后退出 |
只替换指定范围
只替换当前行:
:s/foo/bar/g替换第 10 到第 30 行:
:10,30s/foo/bar/g替换从当前行到文件末尾:
:.,$s/foo/bar/g先在可视模式选中一段文本,再输入 :,Vim 会自动出现 '<,'> 范围。继续输入替换命令即可:
:'<,'>s/foo/bar/g替换路径时换分隔符
默认替换命令用 / 分隔查找内容和替换内容。如果要替换路径,里面也有很多 /,继续使用默认分隔符会很难读。
例如把 /etc/old/app.conf 替换为 /etc/new/app.conf,可以把分隔符换成 #:
:%s#/etc/old/app.conf#/etc/new/app.conf#gVim 的 :s 命令不要求一定使用 /,只要前后一致即可。常用的替代分隔符有 #、@、|。
只替换完整单词
如果只想替换完整的 foo,避免把 foobar 里的 foo 也替换掉,可以用单词边界:
:%s/\<foo\>/bar/g其中:
\<表示单词开头。\>表示单词结尾。
大小写匹配
强制忽略大小写:
:%s/foo/bar/gi也可以在查找内容里写 \c:
:%s/foo\c/bar/g强制区分大小写:
:%s/foo\C/bar/g如果你不确定当前 Vim 配置里 ignorecase、smartcase 是什么状态,在替换命令里显式写 \c 或 \C 会更可靠。
先查找,再替换上一次查找内容
可以先用 / 查找:
/foo确认匹配目标无误后,用空查找模式表示“沿用上一次查找内容”:
:%s//bar/g这在长正则或复杂关键词替换时很方便:先查找确认,再执行替换。
常用查找操作
向下查找:
/foo向上查找:
?foo跳到下一个匹配:
n跳到上一个匹配:
N用 change 命令改当前单词
有时不需要全局替换,只想快速修改光标下的单词,可以使用 change 系列命令。
修改从光标位置到单词结尾:
cw修改当前整个单词,不管光标在单词的哪个位置:
ciw修改整个单词并包含周围空白:
caw例如一行内容是:
hello world光标在 hello 的任意字符上时,输入:
ciw再输入:
hi按 Esc 后,内容就会变成:
hi world小结
最常用的几条命令可以记这几条:
:%s/foo/bar/g
:%s/foo/bar/gc
:10,30s/foo/bar/g
:%s/8\.8\.8\.8/10.20.20.29/g
:%s#/old/path#/new/path#g
:%s/\<foo\>/bar/g日常修改配置文件时,建议先用 /关键词 查找确认范围;涉及 IP、域名、路径这类内容时,优先考虑是否需要转义特殊字符或更换分隔符。