替换命令的基本语法
语法为 :[addr]s/源字符串/目的字符串/[option]
全局替换命令为::%s/源字符串/目的字符串/g
[addr] 表示检索范围,省略时表示当前行。
如:"1,20" :表示从第1行到20行;
:50, 100 s / old / new / g
"%" :表示整个文件,同"1,$";
".,$" :从当前行到文件尾;
s : 表示替换操作
[option] : 表示操作类型
如:g 表示全局替换;
c 表示进行确认
p 表示替代结果逐行显示(Ctrl + L恢复屏幕);
省略option时仅对每行第一个匹配串进行替换;
如果在源字符串和目的字符串中出现特殊字符,需要用”\”转义
确认替换
使用搜索替换命令有时候会出错,而得到不想要的结果。所以小心并确认文件中需要修改的内容是一个明智的做法
在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认:
:1, 30 s /old/new/ gc
将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)?
y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,^E和^Y是提示你用Ctrl+e或Ctrl+y来滚动屏幕的。
上下文相关替换
除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,我们把这种替换叫做上下文相关替换。
语法格式如下:
:g /pattern/s/old/new/g 将会把包含pattern的行中,把所有old替换为new
第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。在那些包含模式pattern的行上,ex将把old替换(s)为new。最后的g表示在该行上进行全部替换。
如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它:
:g/string/s//new/g 等价于 :g/string/s/string/new/g
下面是一些例子:
将That or this 换成 This or that
:%s/(That) or (this)/\u\2 or \l\1/
—-
将句尾的child换成children
:%s/child([ ,.;!:?])/children\1/g
—-
将mgi/r/abox换成mgi/r/asquare
:g/mg([ira])box/s//mg//my\1square/g <=> :g/mg[ira]box/s/box/square/g
—-
将多个空格换成一个空格
:%s/ */ /g
—-
使用空格替换句号或者冒号后面的一个或者多个空格
:%s/([:.]) */\1 /g
—-
删除所有空行
:g/^
/d—−删除所有的空白行和空行:g/[][]∗
/d
—-
在每行的开始插入两个空白
:%s/^/> /
—-
在接下来的6行末尾加入.
:.,5/
/./—−颠倒文件的行序:g/.∗/m0O<=>:g//m0O—−寻找不是数字的开始行,并将其移到文件尾部:g!/[0−9]/m
<=> g/^[^0-9]/m
—−将文件的第12到17行内容复制10词放到当前文件的尾部:1,10g//12,17t
~~~~重复次数的作用
—-
将chapter开始行下面的第二行的内容写道begin文件中
:g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin
—-
:/^part2/,/^part3/g/^chapter/.+2w>>begin|+t$