我写了一个网页的一部分,其中包含以下内容......
<span id="item01"> some first presented text</span>
<span id="item02"> some other text, presented second</span>
<span id="item03"> more text</span>
....
<span id="item15"> last bit of text.</span>
然后我意识到它应该从14到0编号,而不是1到15.(是的,我的设计不好,而不是先计划好JavaScript。)
问题。在vim中有一个简单的方法来对正则表达式中的数字进行数学运算吗?我想要做的是搜索文本“item [00-99]”,并让它返回文本“item(15-original number)”
搜索似乎很容易 - / item([0-9] [0-9])/ (将找到的数字放入缓冲区的括号),但是甚至可以对此进行数学处理吗? Macro for making numbered lists in vim?提供了一种从头开始编号的方法,但我正在寻找一种重新编号的方法。
答案 0 :(得分:10)
:%s/item\zs\d\+/\=15 - submatch(0)/
会做你想做的事。
打破它:
item\zs\d\+
:匹配item
后的数字(\zs
表示匹配的开头)\=
:表示替换是表达式15 - submatch(0)
:返回15减去匹配的数字答案 1 :(得分:2)
您可能需要查看VisIncr plugin。它增加了对以各种格式增加/减少数字,日期和日期名称列的支持。当你必须处理这些事情时非常方便。
答案 2 :(得分:1)
如果您使用perl的vim(默认情况下有许多发行版),您可以
使用:perldo
命令来执行此操作。 (@Marth解决方案更好)
:perldo s/(?<=item)(\d+)/15 - $1/e
答案 3 :(得分:1)
另一种有趣的方式是使用g<CTRL-a>
(有关更多信息,请使用:help v_g_CTRL-A
)
从
开始<span id="item01"> some first presented text</span>
<span id="item02"> some other text, presented second</span>
<span id="item03"> more text</span>
....
<span id="item15"> last bit of text.</span>
使用可视块模式将所有数字重置为00
:
<CTRL-V>
选择所有数字r0
将所有数字替换为零应该看到您了:
<span id="item00"> some first presented text</span>
<span id="item00"> some other text, presented second</span>
<span id="item00"> more text</span>
....
<span id="item00"> last bit of text.</span>
现在使用gv
恢复您的块选择,或者仅使用V
选择所有行,然后按g<CTRL+a>
<span id="item01"> some first presented text</span>
<span id="item02"> some other text, presented second</span>
<span id="item03"> more text</span>
....
<span id="item015"> last bit of text.</span>
不幸的是,这里需要最后一次清理。如您所见,所有两位数字都位于0
的前面。再次使用可视块模式<CTRL+v>
选择并删除不需要的零。
<span id="item01"> some first presented text</span>
<span id="item02"> some other text, presented second</span>
<span id="item03"> more text</span>
....
<span id="item15"> last bit of text.</span>
现在您已经完成了:)