vim 全局替换命令

语法为 :[addr]s/源字符串/目的字符串/[option]

[addr] 表示检索范围,省略时表示当前行。
如:
“1,20” :表示从第1行到20行;
“%” :表示整个文件,同“1,$”;
“. ,$” :从当前行到文件尾;

s : 表示替换操作

[option] : 表示操作类型
如:
g 表示全局替换;
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;

注意:如果在源字符串和目的字符串中出现特殊字符,需要用””转义

全局替换命令为::%s/源字符串/目的字符串/g

举个简单的栗子:

#将该文件中所有的hello改为world
:%s/hello/world/g

来几个稍微复杂点儿的栗子:

#将句尾的child换成children
:%s/child([ ,.;!:?])/children1/g
其中child([ ,.;!:?])这部分是匹配child,并且child这个单词还必须在句尾(也就是说child后面有逗号、句号、分号、叹号、冒号或问号等这些句尾标点符号),所以后面要加上[ ,.;!:?],意思是child后面如果有中括号里面提到的任意一个字符就匹配成功,要换成children。而(和)则是转义,替换命令中()有别的用途,所以如果我们用到了(),就要加转义。

#将多个空格换成一个空格
:%s/ / /g
其中,
表示前面的字符(*前面的字符是空格)重复1-无数次,也就实现了多个匹配多个空格。

如果还想深究,可以去了解一下正则表达式或bash中的匹配表达式。