Chinaunix首页 | 论坛 | 博客
  • 博客访问: 647447
  • 博文数量: 175
  • 博客积分: 2457
  • 博客等级: 大尉
  • 技术积分: 1488
  • 用 户 组: 普通用户
  • 注册时间: 2011-07-13 20:31
文章分类

全部博文(175)

文章存档

2012年(22)

2011年(153)

分类:

2011-12-23 15:36:10

在上一篇文章中,我们使用了两条VIM替换命令,下面详细剖析一下这两条命令。

以第一条命令为例,第二条命令和第一条命令类似:

:'<,'>s/BIT_MASK_\zs\d*\ze/\=line(".") - line("'<") + 1

这条命令在我们选中的区域内进行替换,查找以“BIT_MASK_”开头,后面跟任意多个数字的字符串,并把匹配位置放在数字上,然后使用后面表达式计算出来的数字替换这些匹配的数字。
下面是这条命令中每个元素的含义:

'<,'>        我们所选中的区域 (:help '<,:help '> )
s            在选中的区域中进行替换 (:help :s )
\zs          指明匹配由此开始 (:help 
/\zs )
\d
*          查找任意位数的数字 (:help /\d )
\ze          指明匹配到此为止 (:help 
/\ze )
\=           指明后面是一个表达式 (:help :s\= )
line(
".")    当前光标所在行的行号 (:help line() )
line(
"'<"  我们所选区域中第一行的行号 (:help line() )

'<”和“'>”是我们使用了“v”,“V”命令选中一个visual区域后,VIM设置的标记,分别用来标识visual区域的开始和结束。
BIT_MASK_\zs\d*\ze”是一个正则表达式,用来查找以“BIT_MASK_”开头,后面跟任意多个数字的字符串。其中“\zs”、“\ze”用来指定匹配的开始和结束位置,因为我们只打算替换“BIT_MASK_0”中的数字,所以在查找时只把匹配区域置在数字上。
由于我们的替换操作要把不同行的数字替换成不同的值,所以在这里需要使用一个表达式来计算出替换后的值。当“:s”命令的替换字符串是以“\=”开头时,表明使用一个表达式计算的结果进行替换。我们这里的表达式就是“line(".") - line("'<") + 1”,其中“line()”函数用来获得行号,它可以获得当前行的行号,以及指定的标记(mark)所在的行号。“line(“.”)”用来获得当前光标所在行的行号,“line(“’<”)”则用来获得“'<标记所在行的行号。这两个行号的差加上1就是我们想替换的值。
阅读(1085) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~