vim文本替换

一、基本模式

在命令模式下,可以实现快速替换文本,这在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、断行(明天再说。。)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值