举例,以下文本中有个DSC开头的以数字命名的jpg文件,我想修改文件名为在原来的基础上加上32,比如第一行中的字符改为:DSC00099.JPG

在vim中输入:
:%s/DSC[0]\+\(\d\+\)/\=printf("DSC%05d",submatch(1)+32)/

详解:

\(\)之间的内容是与submatch(1)中对应的内容,也就是说,submatch(1)代表了\(\)中间的内容,这里是匹配的数字。

printf()函数与c语言中的一样,“”中的内容就是格式化输入的内容

\d 表示匹配数字

\+ 表示匹配1次或者多次

[0] 表示匹配数字0

\= 表示后面的内容是个表达式

:%s/find/replace/ 表示查找find后用replace替换

 

如果输入中没有:[0]\+,那么\(\)会匹配DSC后面的00067,vim会认为00067是个8进制数(十进制是:55)。

补充几个快捷键:

cc:删除当前行并在合适的位置开始输入,等价于ddo

在插入模式下,<C-R>然后按=号可以调用简单的计算器

:g/^$/d 删除空白行  

 

 1 DSC00067.JPG
 2 stuos/j;itpoismlojmhl;lj/DSC00066.JPG
 3 /kjoiuo/poi\joij/DSC00068.JPG
 4 DSC00069.JPG
 5 DSC00070.JPG
 6 /kjoiuo/poi\joij/DSC00071.JPG
 7 /kjoiuo/poi\joij/DSC00072.JPG

 

这个问题困扰我了一会儿,还是我老婆给了我思路,谢谢老婆。