Estou trabalhando com VIm
e tentando configurar um pesquisar e substituir o comando para fazer algumas substituições onde posso reutilizar a expressão regular que faz parte da minha string de pesquisa.
Um exemplo simples seria uma linha onde desejo substituir (10)
para {10}
, onde 10 pode ser qualquer número.
Eu vim até aqui
.s/([0-9]*)/what here??/
que corresponde exatamente à parte que desejo.
Agora, a substituição, tentei
.s/([0-9]*)/{\0}/
Mas, isso dá como saída {(10)}
Então, eu tentei
.s/(\zs[0-9]*\ze)/{\0}/
No entanto, isso deu me ({10})
, que também fecho, mas não o que quero.
Acho que preciso de algum outro tipo de marcação / referência inversa em vez deste \0
, mas não sei onde procurar. Então a questão é: isso pode ser feito no vim, um Em caso afirmativo, como?
Resposta
\0
é a correspondência completa. Para usar apenas parte dele, você precisa defini-lo desta forma e usar \ 1
.s/(\([0-9]*\))/{\1}/
Instruções mais detalhadas que você pode encontrar aqui ou na ajuda do vim.
Comentários
- Observe que os parênteses para a captura têm escape de barra invertida.
Resposta
Herdei recentemente algum código legado e queria substituir todas as ocorrências como:
print "xx" print x,y print "xx"
para
logging.info("xy")
ou
logging.info(x,y)
Com base na resposta anterior e na esperança de que alguém se beneficie disso, usei o seguinte comando, que mudará todas as ocorrências:
%s/print\( .*\)/logging.info\(\1\)/g
Se você substituir %
por .
e remova /g
você acabará com
.s/print\( .*\)/logging.info\(\1\)
que permitirá que você passar por cima de cada partida e escolha se deseja alterá-la ou não.
Resposta
A melhor maneira de permitir que você repasse cada partida é adicione um “c” ao final do código, em vez de seguir linha por linha
%s/print\( .*\)/logging.info\(\1\)/gc
Comentários
- Isso realmente não ' responde à pergunta original de forma alguma