Eu tenho várias linhas em um arquivo e gostaria de copiar cada linha 11 vezes (transformando cada linha em 12 linhas) e incrementar o último "1" em cada linha para que as 12 linhas tenham "1" a " 12 ", onde o" 1 "estava inicialmente. Pode haver outras ocorrências de "1" em cada linha, mas o "1" que eu quero incrementar sempre será a última ocorrência em cada linha. Outra maneira de ver é que o último "1" é sempre depois de "/ nt /" - como em "/ nt / 1" (e sempre será a única ocorrência de "/ nt / 1" em cada linha) .
Então, por exemplo, se eu tiver:
1stlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/1blah
3rdlineblahblahblah/nt/1blah
Eu quero transformá-lo em:
1stlineblahblahblah/nt/1blah
1stlineblahblahblah/nt/2blah
1stlineblahblahblah/nt/3blah
1stlineblahblahblah/nt/4blah
1stlineblahblahblah/nt/5blah
1stlineblahblahblah/nt/6blah
1stlineblahblahblah/nt/7blah
1stlineblahblahblah/nt/8blah
1stlineblahblahblah/nt/9blah
1stlineblahblahblah/nt/10blah
1stlineblahblahblah/nt/11blah
1stlineblahblahblah/nt/12blah
2ndlineblahblahblah/nt/1blah
2ndlineblahblahblah/nt/2blah
2ndlineblahblahblah/nt/3blah
...
Eu já havia encontrado o comando:
:for i in range(0,12) | put ='1stlineblahblahblah/nt/'.i.'blah' | endfor
funciona para esse fim, mas eu teria que executar manualmente esse comando para cada linha e digitar cada linha (ou copiar e colar) pessoalmente. Existe uma maneira de pegar as linhas que já estão no arquivo e apenas executar um comando que transforma cada linha em doze, da maneira que descrevi?
Agradeço antecipadamente a quem puder me ajudar com isso. Eu também queria apenas observar que esta é a minha segunda pergunta aqui e fiquei satisfeito por ter conseguido várias soluções rápidas e eficazes para a minha primeira pergunta, pela qual eu sou muito grata.
fonte
Você poderia fazer isso
global
comando ex para executar o número de macro n vezes para cada linha do arquivo.Depois de gravar a macro, desfaça as alterações feitas durante a gravação, ou haverá n + 1 linhas adicionais para a primeira linha e n para linhas consecutivas.
Grave a macro no
a
registro comIsso registra no register
a
(qa...q
) o seguinte comando:yyp
: duplicar a linha atual$
: mover para o final da linha?\d<CR>
: pesquise um dígito para trás<C-A>
: incrementa o dígito sob o cursor em umQuando a macro é gravada, remova as alterações feitas durante a gravação, desfazendo (
uu
) ou excluindo a linha atual (dd
). Em seguida, repita a macro11
(ou qualquer número de) vezes para cada linha do arquivo com o comando global:fonte
Dois caminhos:
Use uma macro!
Começando com
Com o cursor na primeira linha
O que faz:
qq
Comece a gravar uma macro no registro qyyp
puxe a linha atual e cole-a abaixo$?\d<CR>
Vá para o final da linha e encontre o primeiro dígito olhando para trás<Ctrl-a>
Incrementar o númeroq
Pare de gravar a macro.Isso deixa você com:
Com o cursor na segunda linha. Simplesmente repita essa macro quantas vezes desejar (por exemplo, repita-a dez vezes com 10 @ q). Se você deseja automatizar esse processo para cada linha, execute-o globalmente em cada linha:
:g//normal 11@q
Como alternativa, com uma versão mais recente do vim: cole a linha desejada, quantas vezes, bloco visual selecione o dígito que deseja incrementar e pressione
g <Ctrl-a>
. Isso deve incrementar todos os números no bloco visual conforme desejado. Este é um processo mais manual, no entanto.fonte
g <c-a>
caminho. Obrigado por compartilhar.Acho mais fácil usar macros para tarefas únicas como essa. Basta começar a gravar uma macro com o
q
nome + do registro e executar a tarefa uma vez. Eu vejo uma tarefa repetível aqui:Agora grave as teclas necessárias para registrar
a
, no modo normal:Exclua a linha novamente para testar se a execução da macro 11 vezes produz o resultado correto para uma linha:
Faz! Então, vamos desfazer novamente e automatizar todo o processo em uma segunda macro
b
:Agora você pode executar
@b
até o final do arquivo e deve produzir a saída desejada. Parece complicado, mas realmente não é assim que você está acostumado com os padrões de edição típicos.fonte
qaVyp$b<c-a>
. Ou melhor, apenasqayyp$b<c-a>
.qqyyp$?\d<CR><Ctrl-a>q
por @fruglemonkey e @jjaderberg é melhor, uma vez que procura o último número que eu vou mudá-lo para ser completo..Salve a macro a seguir e use-a para cada linha:
A principal diferença em relação às outras respostas é que isso faz uso de
g<C-a>
uma seleção de coluna que incrementa cada linha com um número diferente. Verifique:help v_g_CTRL-A
para mais informações. Também usei\zs
para selecionar a posição inicial do padrão, de modo que o cursor pare no número após a pesquisa.Observe que você precisa de uma versão recente do Vim para que isso funcione.
fonte
g<C-a>
que @fruglemonkey e você mencionou, mas obrigado por responder. Devo observar que ao tentar sua macro - pouco antes de chegar àg<C-a>
parte, não é o último caractere "1" que estou procurando incrementar que é destacado em bloco, mas, em vez disso, é o caractere antes do primeiro "1 "personagem que é destacado em bloco. (Além disso, eu acho que teria que seryy11p
e10j
no macro, desde que eu estou olhando para adicionar 11 linhas - para um total de 12.)\zs
, mas eu poderia simplesmente adicionar uml
depois<CR>
.vim -u NONE
. Acabei de fazer isso e isso funciona perfeitamente! De fato, não há como a pesquisa corresponder ao primeiro 1 porque requer uma barra anterior.