vim全文替换必须用:%s/原词/新词/g命令,/仅用于搜索定位;%表示全文范围,s为substitute,g确保每行全部匹配;漏g将导致每行仅替换首个匹配项。

vim 中全文替换用 :%s 命令,不是 / 搜索
很多人先按 / 搜到单词,再想批量替换成别的——这行不通。/ 只是移动光标或高亮,不触发替换。真正做全文替换,必须进命令模式输 :%s/原词/新词/g。
注意三个关键点:% 表示全文范围(等价于 1,$),s 是 substitute,g 表示当前行内全部匹配(否则只换第一个)。漏掉 g 是最常见失误,结果每行只改一次。
-
:%s/foo/bar/g—— 全文把 foo 替成 bar,区分大小写 -
:%s/foo/bar/gi—— 加i忽略大小写(Foo、FOO也中招) -
:%s/\<foo>/bar/g</foo>——\ 和 <code>\>锁定单词边界,避免把food里的foo也换了
替换前建议先预览匹配位置
直接 :%s/.../.../g 有风险,尤其正则稍复杂时容易误伤。更稳妥的做法是先用 / 搜一遍确认范围:
输入 /\<foo></foo>(加单词边界),回车,然后按 n 或 N 跳转检查是否所有高亮都是你想要的。如果太多或太少,说明正则要调——比如该加 i 却没加,或该用 \ 却用了普通 <code>foo。
也可以用 :g/foo/p 列出所有含 foo 的行号和内容,快速扫一眼上下文。
含特殊字符的单词必须转义
如果要替换的词里有 /、.、*、^、$ 这类正则元字符,不转义就会被当成模式语法解析,轻则不匹配,重则报错 E486: Pattern not found 或乱替换。
- 想替
https://example.com,得写成:%s/https:\/\/example\.com/newurl/g(斜杠和点都要加反斜杠) - 或者换分隔符避开斜杠:用
:%s#https://example\.com#newurl#g,这时#成为分隔符,原 URL 里的/就不用转了(但.仍需转) - 变量名如
$PATH,$是行尾锚点,必须写成\$PATH
需要确认每处替换就加 c 标志
不确定是否每处都该换?加 c(confirm)标志::%s/foo/bar/gc。vim 会停在每一处匹配,提示 replace with bar (y/n/a/q/l/^E/^Y)?:
-
y换这一处 -
n跳过 -
a全部剩余都换(all) -
q退出不继续 -
l只换这一处并停止(last)
这个交互式流程对重构变量名、改配置项特别有用,但别在几千行日志里用——会卡死。真要批量审慎替换,先 :g/pattern/p 看分布,再决定用 gc 还是直接 g。
实际替换后记得 :w 保存,vim 不自动写盘。另外,u 可一键撤回整批替换,但仅限本次 vim 会话内未关闭文件;关了再开就只能靠 :e! 重载原始内容了。











