Vim 查找替换命令速查

整理 Vim 中常用的查找、替换、确认替换、范围替换和 change 系列命令,并说明替换 IP 地址、路径和特殊字符时容易踩的坑。

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#g

Vim 的 :s 命令不要求一定使用 /,只要前后一致即可。常用的替代分隔符有 #@|

只替换完整单词

如果只想替换完整的 foo,避免把 foobar 里的 foo 也替换掉,可以用单词边界:

:%s/\<foo\>/bar/g

其中:

  • \< 表示单词开头。
  • \> 表示单词结尾。

大小写匹配

强制忽略大小写:

:%s/foo/bar/gi

也可以在查找内容里写 \c

:%s/foo\c/bar/g

强制区分大小写:

:%s/foo\C/bar/g

如果你不确定当前 Vim 配置里 ignorecasesmartcase 是什么状态,在替换命令里显式写 \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、域名、路径这类内容时,优先考虑是否需要转义特殊字符或更换分隔符。