
У меня есть следующий 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+ V2жл
Увеличьте каждое число на пять:
:norm 5
Ctr+ V Ctr+ A Пояснение:
:norm
выполняет всю команду в обычном режиме. Ctr+ Vнеобходим, иначе курсор переместится обратно в начало строки.
Ctr+ Aувеличивает число на 1, и это делается 5 раз. Визуальный диапазон вставляется автоматически после нажатия двоеточия.
РЕДАКТИРОВАТЬ: Как правильно заметил Стефан, предыдущий код увеличивает первое число, найденное в любой строке. Вот лучшее решение:
%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
поскольку не понимает отрицательных чисел.