Substitua usando VIM, reutilize parte do padrão de pesquisa

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

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *