1. 替换
1.1 光标所在行的替换
其中,,s表示插入,g表示当前行查找
:s/abc/xyz/g
1.2 全文替换
其中,1表示第1行,$表示最后1行
:1,$s/abc/xyz/g
其中,%表示全文
:%s/abc/xyz/g
1.3 转义替换
其中, S.替换为S->
此处因为点号“.”为特殊匹配符,在正则中表示单个字符,所以如果想匹配点号,就需要把“\”放在点号前面,表示取消点号的特殊意义。
:s/S\./S->/g
1.4 连间隔符都可以改变
如果你要匹配和替换“http://roclinux.cn/index.php”这样一个 URL,你会发现这很麻烦
:%s/http:\/\/roclinux\.cn\/index\.php/https:\/\/www\.baidu\.com/index\.php/g
里面好多的正斜线“\”和反斜线“/”啊,真是一个反人类的替换表达式
Vim 允许我们自定义间隔符,比如我们可以用 # 来替换/,如 s/abc/xyz/ 可以替换为 s#abc#xyz#,或者 s!abc!xyz!都是可以的
改良:
:%s#http://roclinux\.cn/index\.php#https://www\.baidu\.com/index\.php#g
1.5 复杂替换
如果我希望在含有日期格式(XXXX-XX-XX)的字符串两侧加上一对单引号,即 2008-07-01 变成‘2008-07-01’,应该如何写这个替换表达式呢?
原文件为
aaa 2008-07-01 bbb
ccc 2008-07-12 aaa
我们需要用下面的替换命令来实现加引号的效果:
:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/'\1'/g
替换后为:
aaa '2008-07-01' bbb
ccc '2008-07-12' aaa
这个替换命令比较复杂,我们要逐步解释一下,这里面共涉及了三个知识点:
第一个知识点:[0-9] 表示 0 到 9 之间的任一个数字,这是正则中表示数字集合的标准写法。
第二个知识点:{n} 表示将此符号前面的元素重复 n 遍,所以 [0-9]{4} 就表示一个四位数的数字。
第三个知识点:如果在匹配方案中用到了(),则表示要暂存括号中所匹配到的内容,而 \1 表示替换为暂存的内容(题外话:如果存在多个括号组,则后面要通过编号来依次对应,如 \1、\2、\3 等)。在本例中,我们匹配的是 2008-07-01,那么加了括号后就会被暂存起来,而在后面的 \1 处就会被替换过来,外面再加一对引号,就完成了!
转自: