VIM字符匹配交换

Vim中可以通过模式匹配实现复杂的字符匹配和替换,《Learning the vi and Vim Editors》书中称之为Pattern-Matching。例如使用\(\)缓冲区模式可以实现不同缓冲区hold buffer之间交替,在vim中最多可支持9个hold buffer1

例1:将me and you字符串替换为you and me,可以使用如下命令:

C1

:%s/\(me\) and \(you\)/\2 and \1/gc

例1中命令 C1 将字符串me and you切割成12两部分hold buffer,然后把两块hold buffer索引位进行交换,实现字符串交换。需要注意:and与前后字符串之间都有一个空格符,如果在命令中将第一个and的前后空格符去掉,则无法匹配。这是因为空格符去掉后,字符没法完成切成两块,换而言之就是无法匹配。如:

C2

:%s/(me)and(you)/\2 and \1/gc

C2 命令执行将会提示Pattern not found:\(me\)and\(you\)

如果将 C1 命令中的第二个and前后空格符去掉如命令 C3 ,执行后得到的字符串将是youandme。实际上命令 C1 大致可分为查找匹配模式和替换模式:\(me\) and \(you\)可视为查找匹配模式,\2 and \1可以视为替换模式。可以理解为首先查找匹配到两个缓冲块12,然后根据替换模式拼接字符串。命令 C3 就是将两个缓冲块12直接拼接到and两侧,因此得到的结果是:youandme\(\)模式详细理解可以看下述例2

C3

:%s/(me) and (you)/\2 and \1/gc

例2:把文中的所有字符串“a..bc<——->xy….z”替换为“xy….z<——->a..bc”可以进行以下写法2

:%s/\(a.*bc\)\(<.*>\)\(xy.*z\)/\3\2\1/gc

以上表达式中可以拆开几部分理解:

  • %s 声明全文查找匹配
  • 查找匹配模式
    • \(a.*bc\)1个缓冲块(hold buffer):使用通配符.*匹配查找以a开头,bc结尾的字符串,并以括号()括起来作为第1个独立内容的块,反斜杠\在这里是转义符
    • \(<.*>\)2个缓冲块(hold buffer):使用通配符.*匹配任意内容,并以括号()括起来作为第2个独立内容的块,反斜杠\在这里同样是转义符
    • \(xy.*z\)3个缓冲块(hold buffer):使用通配符.*匹配查找以xy开头,z结尾的字符串,并以括号()括起来作为第3个独立内容的块,反斜杠\在这里同样是转义符
  • 替换模式
    • \3\2\1 这里意思是把第3个和第1hold buffer交换位置,第2hold buffer位置不变,实现内容位置交换
  • gc 以询 问确认方式进行全局替换
参考

  1. 《Learning the vi and Vim Editors》
  2. Vim查找替换及正则表达式的使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值