分享:vim高级替换技巧

发布时间:2019-10-14编辑:脚本学堂
本文分享下,有关vim命令的一些高级替换技巧,包括替换变量、利用函数式替换、匹配的开始与结束、高级递增替换等技巧,有需要的朋友参考下吧。

本节主要内容:
vim高级替换技巧

1,替换变量
在正规表达式中使用 ( 和 ) 符号括起正规表达式,即可在后面使用1、2等变量来访问 ( 和 ) 中的内容。

例子:
1)、将 data1 data2 修改为 data2 data1
:s/(w+)s+(w+)/2t1

2)、将 Doe, John 修改为 John Doe
:%s/(w+), (w+)/2 1/   

2,利用函数式替换
用法:
:s/替换字符串/=函数式

说明:
1)、函数式可以有多个,返回值可以用字符串连接符.连接起来,如line(".")返回匹配行号(:help line()  ),submatch(n)可以引用1、2的内容,其中submatch(0)引用匹配的整个内容;
2)、函数式也可以是字符串常量,用双引号引起来。函数式也可以是任意表达式,需要用小括号引起来,如(3+2*6);
3)、函数式还可以是寄存器中的内容,通过"@寄存器名"访问,如@a(不需要加引号,但是还是需要用.来连接);

例子:
将下列8行的data0依次变成data0~7(前面的数字是行号)
 

double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
double data0;
 

如果安装有perl的话,我以前一般都是借助perl来完成这件事情:
:r !perl -n -le "if(s/^(doubles+data)d;/$1$k;/){ $k++; print $_; }" %:p
其中%:p表示包含完整路径的文件名
现在只用vim我们就可以完成这样的事情:
首先将光标移到125行(line(".")返回当前匹配行的行号,line("'a")返回mark a的行号):
ma
:%s/^(doubles+data)d(;)/=submatch(1).(line(".")-line("'a")+1).submatch(2)/g
再或者
首先将光标移到125行(line("'V7j
:%s/^(doubles+data)d(;)/=submatch(1).(line(".")-line("'

3,匹配的开始与结束
zs和ze可以用于替换操作中指明替换的开始与结束,如上例中可以以更短的操作来实现:
ma
:%s#^doubles+datazsdze#=(line(".")-line("'a")+1)#g

另外,还可以使用vim表达式来实现上述功能:
:let n=0 | g/^doubles+datazsd/s//=n/ | let n+=1

其中 ·|      用来分割不用的命令;
·g      在匹配后面模式的行中执行指定的ex命令
·zs    指明匹配由此开始
·s//=n 对匹配模式进行替换,匹配模式为空,表示以上一次匹配成功的模式,
并且指明替换是一个表达式;

4,高级递增替换
把下面几句放到 _vimrc
 

复制代码 代码示例:
let g:I=0
function! INC(increment)
let g:I =g:I + a:increment
return g:I
endfunction

以下问题,可以按如下的方法解决:
:let I=-1 | %s/^ doubles+datazsdze/=INC(1)/

另外,还可以生成数字序列,例如生成1~100间隔为5的数字序列:
:let I=0 | ‘a,’b s/^/=INC(5)/

Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE