我有这个代码:
array ('id' => 1,'name' => "Murka",'date_of_birth' => "2014-10-31","breed_id" => 1),array ('id' => 1,'name' => "Jurka",'date_of_birth' => "2014-11-31","breed_id" => 2),'name' => "Nyash",'date_of_birth' => "2014-12-31","breed_id" => 3),'name' => "Meowy",'date_of_birth' => "2014-01-31","breed_id" => 4),'name' => "Yummi",'name' => "BaRSS",'date_of_birth' => "2014-05-31",'name' => "Nonam","breed_id" => null
我想要更改所有’id’=> 1(除了第1个)所以数字将增加1.使用Emacs很容易实现:
M-x replace-regexp \(1,\) \,(1+ \#),
正如here所述.经过一些研究,我用Vim达到的最大值是(灵感来自here):
:let i=1 | g/1,/ s//\=i/ | let i+=1
但这会删除以下所有逗号:
array ('id' => 1 'name' => "Murka",array ('id' => 2 'name' => "Jurka",array ('id' => 3 'name' => "Nyash",array ('id' => 4 'name' => "Meowy",array ('id' => 5 'name' => "Yummi",array ('id' => 6 'name' => "BaRSS",array ('id' => 7 'name' => "Nonam","breed_id" => null),
所以我必须解决它(我知道这很容易).
我知道this和宏,我只是想知道Vim中是否有任何单行命令解决方案.
更一般的问题:在Vim中是否可以注入一些逻辑,如条件语句,操纵正则表达式反向引用? Emacs中的示例如下:
C-M-% \(^.*\)\(linear-gradient(\)\(to right\|to bottom\)\(.*$\) <RET> \& C-q C-j \1-prefix-\2\,(if (equal "to right" \3) "left" "top")\4
大约一年前,这个帮助我重构了一些具有大量内联CSS的可怕的HTML代码.
我对你的一般问题没有答案,但我确实有一个针对你的具体情况.您可以通过将逗号置于正面预测中来使命令工作,如下所示:
:let i=1 | g/1(\,\)\@=/ s//\=i/ | let i+=1
现在它只会取代1.