Vim通过递减反向引用来搜索和替换?

时间:2009-05-18 04:47:13

标签: regex vim replace

鉴于Vim中的以下文字:

[2] [3] [4]

我想执行搜索并替换并生成以下内容:

[1] [2] [3]

我知道如何通过搜索使用反向引用来提取数字并替换:

:%s/\[\(\d\)\]/[\1]/g

但现在的问题是你如何减少\ 1的价值。

有什么想法吗?

3 个答案:

答案 0 :(得分:16)

尝试

:%s/\[\(\d\+\)\]/\=join(['[', submatch(1) - 1, ']'], '')/g

编辑:我在\+之后添加了\d,以防您想要匹配多位数字。

请参阅:help sub-replace-special

答案 1 :(得分:2)

当您使用\zs\ze将数字锚定在括号内而不匹配它们时,替换变得更简单,因为您不需要在替换中连接:

:%s/\[\zs\d\+\ze]/\=submatch(0)-1/g

答案 2 :(得分:0)

试试这个:

%s:\d:\r&\r:g

然后

s/\d/\=submatch(0)-1/

现在你需要加入这些行。