我有以下 SQL:
update am.PERMISSIONS set PRM_ORDER = 35 PRM_VISIBLE = b'1' where PRM_ID = 3;
update am.PERMISSIONS set PRM_ORDER = [35] PRM_VISIBLE = b'1' where PRM_ID = 7;
update am.PERMISSIONS set PRM_ORDER = [40] PRM_VISIBLE = b'1' where PRM_ID = 10;
update am.PERMISSIONS set PRM_ORDER = [45] PRM_VISIBLE = b'1' where PRM_ID = 11;
...
我用方括号选择视觉块,我想将其中的每个数字增加 5。我该如何做到这一点?
答案1
直观地突出显示括号中的文本:
Ctr+ V2jl
将每个数字增加 5:
:norm 5
Ctr+ V Ctr+A 解释:
:norm
在正常模式下执行整个命令。 +Ctr是V必需的,否则光标将跳回行首。
Ctr+A将数字加 1,共进行 5 次。按冒号后会自动插入可视范围。
编辑: 正如 Stephane 正确指出的那样,前面的代码会递增在任何行上找到的第一个数字。这是一个更好的解决方案:
%s/\[\zs\d\+\ze\]/\=(submatch(0)+5)
它将括号内的所有整数加五。和\zs
用于\ze
从匹配中排除括号并submatch
返回匹配的数字。
答案2
您不需要离开视觉模式来增加数字,只需使用g
5 g Ctrl-a
5 ......... 5 times
g ......... globally
Ctrl-a .... increase numbers
事实上我已经学会了这个技巧维姆高尔夫挑战。
答案3
这两个命令是相同的,并且会增加所有数字之内 视觉选择(即使是在矩形中!)。
:'<,'>s/\%V\d\+\%V/\=submatch(0)+1/g
:s/\%V\d\+\%V/\=submatch(0)+1/g
斩::s
/
\%V
\d\+
\%V
/
\=submatch(0)+1
/
g
这\%V
是一个零宽度匹配器,可以匹配当前(或最后一个)选择范围内的任何位置。
来自 vim 帮助:
\%V Match inside the Visual area. When Visual mode has already been
stopped match in the area that gv would reselect.
This is a /zero-width match. To make sure the whole pattern is
inside the Visual area put it at the start and just before the end of
the pattern, e.g.:
/\%Vfoo.*ba\%Vr
This also works if only "foo bar" was Visually selected. This:
/\%Vfoo.*bar\%V
would match "foo bar" if the Visual selection continues after the "r".
Only works for the current buffer.
不幸的是,这并不那么聪明,ctrl-a
因为它不理解负数。