Vim
中可以通过模式匹配实现复杂的字符匹配和替换,《Learning the vi and Vim Editors》
书中称之为Pattern-Matching
。例如使用\(\)
缓冲区模式可以实现不同缓冲区hold buffer
之间交替,在vim中最多可支持9个hold buffer
1。
例1
:将me and you
字符串替换为you and me
,可以使用如下命令:
C1
:%s/\(me\) and \(you\)/\2 and \1/gc
例1
中命令 C1 将字符串me and you
切割成1
和2
两部分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
可以视为替换模式。可以理解为首先查找匹配到两个缓冲块1
和2
,然后根据替换模式拼接字符串。命令 C3 就是将两个缓冲块1
和2
直接拼接到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
个和第1
个hold buffer
交换位置,第2
个hold buffer
位置不变,实现内容位置交换
gc
以询 问确认方式进行全局替换
参考
- 《Learning the vi and Vim Editors》 ↩
- Vim查找替换及正则表达式的使用 ↩