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

29

Estou trabalhando VIme tentando configurar um comando de pesquisa e substituição para fazer algumas substituições nas quais posso reutilizar a expressão regular que faz parte da minha cadeia de pesquisa.

Um exemplo simples seria uma linha onde eu quero substituir (10)a {10}, onde 10 pode ser qualquer número.

Eu vim até aqui

  .s/([0-9]*)/what here??/

que corresponde exatamente à parte que eu quero.

Agora a substituição, eu 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 me deu o ({10})que eu também fecho, mas não o que eu quero.

Acho que preciso de outro tipo de marcação / referência em vez disso \0, mas não sei para onde procurar. Portanto, a questão é: isso pode ser feito no vim? Se sim, como?

Bernhard
fonte

Respostas:

37

\0é a partida inteira. Para usar apenas parte dele, é necessário configurá-lo dessa maneira e usar \ 1

.s/(\([0-9]*\))/{\1}/

Instruções mais detalhadas você pode encontrar aqui ou na ajuda do vim.

pressa
fonte
Observe que os parênteses para a captura são escapados por barra invertida.
Randall
0

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 dela, usei o seguinte comando, que alterará todas as ocorrências:

%s/print\( .*\)/logging.info\(\1\)/g

Se você substituir %com .e remover /gvocê vai acabar com

.s/print\( .*\)/logging.info\(\1\)

isso permitirá que você repasse cada partida e escolha se a altera ou não.

yagad
fonte
0

Better way to enable you to go over each match is to add a "c" to the end of the code, rather than go line-by-line

%s/print\( .*\)/logging.info\(\1\)/gc
Tim Rosenow
fonte
Isso realmente não responder à pergunta original de qualquer maneira
Bernhard