如何在vim中将字符串(4000到4200)替换为(5000到5200)。
答案 0 :(得分:9)
另一种可能性:
:%s/\v<4([01]\d{2}|200)>/5\1/g
这个也做200,因为它使用\v switch,所以它不会受到“倾斜牙签综合症”的影响太多。
编辑#1:添加了单词边界锚('<'
和'>'
),以防止替换"14100"
等。
编辑#2:有些情况下,“字边界”不足以正确捕获所需图案。如果您希望将空格作为分隔因子,则表达式会变得更复杂。
:%s/\v(^|\s)@<=4([01]\d{2}|200)(\s|$)@=/5\1/g
其中“(^|\s)@<=
”是“行首”或“\s
”以及“(\s|$)@=
”的后备断言是“结束 - ” of-line“或”\s
“。
答案 1 :(得分:5)
:%s/\<4\([01][0-9][0-9]\)\>/5\1/g
答案 2 :(得分:1)
:%s/\<4\([0-1][0-9][0-9]\)\>/5\1/g
将执行4000到4199.您必须单独执行4200/5200。
快速解释。上面找到4,然后是0或1,然后是0-9两次。 0-1,0-9,0-9被包裹在一个组中,替换(在斜杠之后)表示替换为5后跟最后一个匹配的组(\ 1,即4之后的位)。
\&LT;和&gt;是字边界,以防止与14002匹配(thx Adrian)
%表示所有行。 / g表示该行上的每个匹配(而不仅仅是第一个)。
答案 3 :(得分:1)
如果您由于某种原因不想进行完整搜索和替换,请记住ctrl-a
将增加光标下方或之后的下一个数字。因此,在命令模式下,您可以按1000 ctrl-a
将下一个数字增加1000。
如果您使用的是Windows,请参阅this question中有关如何进行ctrl-a
增量而不是全部选择的答案。
答案 4 :(得分:0)
更多打字,但思路不足:
:%s/\d\+/\=submatch(0) >= 4000 && submatch(0) <= 4200 ? submatch(0) + 1000 : submatch(0)/g