“五分钟学命令系列”之九《vi中的替换艺术》

2015年9月28日14:11:23 评论 6,807

vi中的替换方法是很实用,可以提高效率的。所有替换方案都要在冒号“:”状态下书写。

1、将abc替换为xyz

:s/abc/xyz/

PS:这个替换只局限于光标所在当前行,而且更糟糕的是它只替换当前行的第一个匹配项。
即,如果此行内容为I write abc, I read xyz and abc. 那么替换后的结果为I write xyz, I read xyz and abc.

2、将一行里的所有匹配都进行替换

:s/abc/xyz/g

3、将一行里所有的”S.”替换为”S->”

:s/S\./S->/g

PS:此处因为点号“.”为特殊匹配符,所以如果想匹配点号,就需要用\放在点号前面,表示取消点号的特殊意义。

即,此行S.abc and S->bcd and S.aaa,替换后为S->abc and S->bcd and S->aaa

4、要替换全文的S.为S->,则可以用行数来限制

:1,$s/S\./S->/g

PS:在s前面加上m,n则表示行的范围,1表示第一行,$表示最后一行。当然你完全可以指定其他行数。

m或n可以用特殊符号”.”或”$”代表,”.”代表当前行,”$”代表最后一行

如果是确定为全文替换,那么可以用%来代替1,$

即:%s/S\./S->/g

5、用#或者其他任何符号来替换/

当你要匹配一个https://yangfannie.com会很麻烦,因为//符号和/符号都会把替换搞乱。此时,你完全可以用#或者其他任何符号来替换/,如s/abc/xyz/可以替换为s#abc#xyz#,或者s!abc!xyz!都是可以的

下面使用了#符号替换

:s#http://yangfannie\.com#http://www\.baidu\.com#

即,此行https://yangfannie.com and http:/abc/efg,替换后为http://www.baidu.com and http:/abc/efg

6、把具有日期格式(XXXX-XX-XX)的字符串两侧加上一对单引号,即2015-09-28变成’2015-09-28’

:1,$s/\([0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}\)/’\1’/g

PS:

a:[0-9]表示0到9之间的任一个数字

b:\{n\}表示将此符号前面的元素重复n遍,所以[0-9]\{4\}就表示一个四位数的数字

c:如果在匹配方案中用到了\(\)则表示要暂存这个匹配内容,而\1就表示要替换为暂存的匹配内容,我们匹配的如果是2015-09-28,那么加了括号后就会被暂存,而在后面的\1处就会被替换过来,外面再加一对引号,就可以了.

weinxin
聂扬帆博客
一个分享IT运维相关工作经验和实战技巧的个人博客

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: