【发布时间】:2014-10-31 18:51:09
【问题描述】:
我有这个代码:
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),
array ('id' => 1, 'name' => "Nyash", 'date_of_birth' => "2014-12-31", "breed_id" => 3),
array ('id' => 1, 'name' => "Meowy", 'date_of_birth' => "2014-01-31", "breed_id" => 4),
array ('id' => 1, 'name' => "Yummi", 'date_of_birth' => "2014-10-31", "breed_id" => 2),
array ('id' => 1, 'name' => "Barss", 'date_of_birth' => "2014-05-31", "breed_id" => 2),
array ('id' => 1, 'name' => "Nonam", 'date_of_birth' => "2014-05-31", "breed_id" => null
我想更改所有'id' => 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", 'date_of_birth' => "2014-10-31", "breed_id" => 1),
array ('id' => 2 'name' => "Jurka", 'date_of_birth' => "2014-11-31", "breed_id" => 2),
array ('id' => 3 'name' => "Nyash", 'date_of_birth' => "2014-12-31", "breed_id" => 3),
array ('id' => 4 'name' => "Meowy", 'date_of_birth' => "2014-01-31", "breed_id" => 4),
array ('id' => 5 'name' => "Yummi", 'date_of_birth' => "2014-10-31", "breed_id" => 2),
array ('id' => 6 'name' => "Barss", 'date_of_birth' => "2014-05-31", "breed_id" => 2),
array ('id' => 7 'name' => "Nonam", 'date_of_birth' => "2014-05-31", "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 代码。
【问题讨论】:
标签: regex vim emacs increment substitution