vim 中的字符串替换:为啥 %s/foo/bar 有效? [复制]

Posted

技术标签:

【中文标题】vim 中的字符串替换:为啥 %s/foo/bar 有效? [复制]【英文标题】:String replace in vim: Why does %s/foo/bar work? [duplicate]vim 中的字符串替换:为什么 %s/foo/bar 有效? [复制] 【发布时间】:2018-08-04 14:05:38 【问题描述】:

:%s/foo/bar/g

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

它“有效”,但它做了一些不同的事情。如果每行只有一个匹配项,那么 /g 当然是多余的。 意识到这是一个冲动的问题,我可以很容易地查到。请关闭问题。如果我可以自己关闭它,我会这样做【参考方案2】:

%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

【讨论】:

以上是关于vim 中的字符串替换:为啥 %s/foo/bar 有效? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Vim查找和替换

Linux 之 vi vim 常用快捷方式

vim常见操作

一张图牢记vim常用命令

shell sed语法详解

仅在大括号外替换文件中的字符串