vim 中的字符串替换:为什么 %s/foo/bar 有效?

String replace in vim: Why does %s/foo/bar work?

:%s/foo/bar/g

这个vim 命令为我节省了很多时间。但是今天我不小心输入了

:%s/foo/bar 没有全局 (g) 结尾,但它仍然有效!我很困惑。这是怎么回事?使用 /g 更好吗?为什么?

即使您不指定 /g,它也能正常工作,但它只会替换文件中第一次出现的匹配项,而不是第二次和连续出现的匹配项。

%s/foo/bar/g 对每一行运行 s/foo/bar/g。这会将 foo 的所有实例替换为 bar

%s/foo/bar 对每行运行 s/foo/bar。这将 foo 的第一个实例替换为 bar

假设您的文件包含

foo foo foo
foo foo foo
foo foo foo

然后%s/foo/bar/g变成

bar bar bar
bar bar bar
bar bar bar

但是%s/foo/bar变成了

bar foo foo
bar foo foo
bar foo foo