
Eu tenho o seguinte 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;
...
com colchetes seleciono o bloco visual, onde quero aumentar cada número em 5. Como faço isso?
Responder1
Destaque visualmente o texto entre colchetes:
Ctr+ V2jl
Aumente cada número em cinco:
:norm 5
Ctr+ V Ctr+ A Explicação:
:norm
executa todo o comando no modo normal. O Ctr+ Vé necessário, caso contrário o cursor voltaria ao início da linha.
Ctr+ Aaumenta um número em 1 e isso é feito 5 vezes. O alcance visual é inserido automaticamente depois que você pressiona os dois pontos.
EDITAR: Como Stephane apontou corretamente, o código anterior incrementa o primeiro número encontrado em qualquer linha. Aqui está uma solução melhor:
%s/\[\zs\d\+\ze\]/\=(submatch(0)+5)
Ele adiciona cinco a todos os números inteiros entre colchetes. Os \zs
e \ze
são usados para excluir os colchetes da correspondência e submatch
retornar o número correspondente.
Responder2
Você não precisa sair do modo visual para aumentar os números, basta usarg
5 g Ctrl-a
5 ......... 5 times
g ......... globally
Ctrl-a .... increase numbers
Na verdade, aprendi esse truque em umvimgolfdesafio.
Responder3
Esses dois comandos são idênticos e irão incrementar todos os númerosdentro de uma seleção visual (mesmo em um retângulo!).
:'<,'>s/\%V\d\+\%V/\=submatch(0)+1/g
:s/\%V\d\+\%V/\=submatch(0)+1/g
picado::s
/
\%V
\d\+
\%V
/
\=submatch(0)+1
/
g
O \%V
é um matcher de largura zero que corresponde a qualquer lugar dentro da seleção atual (ou última).
Da ajuda do 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.
Infelizmente, isso não é tão inteligente, ctrl-a
pois não entende números negativos.