微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

正则表达式 – Vim – 通过正则表达式搜索和替换的增量编号

我有这个代码
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.

原文地址:https://www.jb51.cc/regex/357285.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐