一、基本模式
在命令模式下,可以实现快速替换文本,这在vim编辑过程中非常实用。基本的格式如下:
:[range]s/pattern/string/[c,e,g,i]
开头的冒号表示进入到命令模式,下面的介绍为了方便会省略这个符号;
[range]表示替换的范围,以行为单位,比如“1,4”为从第一行到第四行,起始行与末尾行以逗号间隔。如果省略range,则表示只替换当前行。s表示替换命令本身;
pattern表示将被查找并替换的文本;
string是替换文本,它将取代pattern;
末尾的额外参数[c,e,g,i]:
c-confirm,表示每次替换前询问(可以避免出现意外);e-error,表示忽略(不显示)错误;g-globe,整行替换,如果没有这个参数,那么只会替换该行第一个pattern;i-ignore,忽略大小写区别。每次可选一个或多个参数。
不同项目之间以/为分隔符;但是如果pattern或string本身包含了/的时候,就需要以#为分隔符;可是如果#也被包含在文本中的话,只好使用跳脱字符\。凡是在替换模式中有特殊功能的符号,都算是被征用了,文本中使用这些符号的话,都需要用跳脱符号\以示区别。
1、全文替换: %s/sth/else/g ,%表示全部文本
2、只替换该行出现的第一个sth为else: s/sth/else/
3、替换该行出现的所有sth为else: s/sth/else/g
4、替换从第n行到第m行所有的sth为else: n,ms/sth/else/g m和n的大小随意
5、替换从当前行到末尾所有的sth为else: .,$s/sth/else/g 这里的.表示当前行,$表示末尾行
6、删除当前行所有的sth: s/sth//g 当string为空时,表示删除对应的pattern
二、进阶:正则表达式
还是从需求出发。
1、如果你想把a aa aaa aaaa aaaaa 等这种重复性的字符替换掉:
pattern应该这样表示: a* 。* 号表示重复任意次它之前的那一个字符,包括0次。
比如:ab*会匹配a ab abb abbb abbbb .....
所以如果星号前面只有一个字符,pattern就会替换掉所有的空字符,包括空格、tab。
如果要避免出现匹配0次的情况,需要用 \+ 代替 *, \+ 表示匹配0次以上的任意次它之前的那一个字符。
2、如果想替换 ab abab ababab ... 这一类的“整体”字符串:
pattern可以这样写: \(ab\)* , 即把整体用括号括起来。但是括号本身需要用跳脱字符。
3、如果我只想替换 aaa aaaa aaaaa这三个即只重复了3-5次的a呢?我们可以指定重复次数。
pattern:a\{3,5} , 花括号里面用一个逗号分隔两个数字,前者表示重复的下界,若省略则默认为0;后者表示重复的上界,省略则默认为无穷大。
如果省略逗号,即花括号里面只有一个数字,那就表示恰好只重复那么多次。如 a\{5} 表示只匹配 aaaaa。
4、替换flag以及它的复数形式flags:
pattern:flags\= , \= 类似于逻辑符号“或” ,即紧挨在它前面的那个字符可有可无。
5、替换{}里面的所有内容: /{.*}/{}/
这个命令会搜寻一对花括号,而不管这里面有没有内容,有哪些内容,然后替换成{},即里面什么也没有的一对花括号。在vim的替换模式里,逗号“.”称作万用字符,即它代表任意的字符(注意,在命令行中万用字符是*,但在vim替换中,星号表示的是重复),后面紧跟一个*号,就可以表示任意字符串。由于在搜寻的时候花括号本身也被替换了,所以在后面要补上。这是一个很重要的技能,花括号本身是定位用的,我们并不想替换它,但是规则如此,所以补救方法是在string栏再补上一个。
6、替换one、two、three其中的任意一个或他们的任意排列组合
pattern:one\|two\|three . \| 才是vim替换里面真正的“或”表达式。在此基础上还有一种更变态的组合:\(one\|two\|three\),我表示很凌乱,你们自己研究一下吧。。。
7、“与”表达式(还在研究)
8、筛选与范围
1》替换a、e、f中的任意一个,我们可能会想到利用“或”表达式,但是这种方式会滥杀无辜——因为ae、ef等排列组合也被误杀了。。。vim提供了另外一种机制来满足这种需求:[ ]
pattern: [aef] 你可以将要匹配的任意单个字符放在[ ]中,这就表示了筛选,只有中括号里面的字符才会被匹配。里面可以是任意字符,包括字母、数字、符号。。。需要注意的是,它一次只匹配单个字符,即不要以为中括号里面字符的排列组合都会被智能匹配,[aef] 不会匹配ae神马的。
2》如果要匹配任意一个数字符号,就要酱:[0123456789] ,显然这太麻烦了,我们可以酱:[0-9]。对所有字母可以酱:[a-zA-Z]。
中括号里面的“-”表示了范围这一概念,条件是,他们必须具有某种“序”,比如[3-6]会匹配3、4、5、6,但是不会匹配1、2、7、8、9、0,因为3-6是按数字的升序排列的,对字母也是一样。
3》补集,我想你们应该知道这个概念想要表达什么,不知道请自行脑补集合论。。。
要替换一行里除了f以外的所有字符,pattern可以酱:[^f]。 “^”表示了补集,但是这一概念只能在[ ]内使用。
9、预定义字符集
相当于定义了一堆快捷方式,比如用\d代替[0-9],表示所有数字符号,下面做个总结:
\d == [0-9] ; \D == [^0-9] ;
\x == [0-9a-fA-F] ; \X == [^0-9a-fA-F] ; (注:十六进制字符)
\s == [ ]; \S == [^ ] ; (空白字符,空格和tab)
\a == [a-zA-Z] ; \A == [^a-zA-Z] ; (\A 我不确定,只是根据前面的规律猜测的,大家可以试一下)
\l == [a-z] ; \L == [^a-z] ;
\u == [A-Z] ; \U == [^A-Z] ;
需要注意的是,这些字符集和[ ]是并列或替代关系,即他们不能在[ ]内部使用。
10、断行(明天再说。。)
原文:http://blog.csdn.net/u012668018/article/details/26353239