Como escapar de barras invertidas e barras normais na localização / pesquisa do VIM?

96

Por exemplo, se eu quisesse localizar e substituir por strings contendo barras invertidas ou avançadas, como isso seria feito no vim? Obrigado!

Exemplos de Localizar e Substituir são: :%s/foo/bar/g

e se eu quisesse encontrar todas as ocorrências de <dog/>e substituí-las por<cat\>

tempestuoso
fonte
3
Não é exatamente uma resposta, mas você provavelmente deveria ler: ajuda mágica
Tom Morris
+1 Tom, geralmente a solução mais sensata ao trabalhar com um regex mais do que trivial.
Randy Morris,
@Tom @Randy no entanto ... vi --helpno meu servidor NÃO fornece uma explicação sobre caracteres especiais de escape ... é por isso que as pessoas vêm para stackoverflow para começar ...
aequalsb
@aequalsb :help magicé algo que você digita no vim. Não é um argumento de linha de comando para o vim.
DoubleDown

Respostas:

150

Da mesma maneira que você escapa caracteres em qualquer outro lugar em programas Linuxy, com uma barra invertida:

:%s/<dog\/>/<cat\\>

Mas observe que você pode selecionar um delimitador diferente:

:%s@<doc/>@<cat\\>@

Isso evita que você digite todas aquelas barras invertidas demoradas e confusas em padrões com uma tonelada de barras.

Da documentação :

Em vez do /que envolve o padrão e a string de substituição, você pode usar qualquer outro caractere de byte único, mas não um caractere alfanumérico \, "ou |. Isso é útil se você deseja incluir um /no padrão de pesquisa ou string de substituição.

Cascabel
fonte
1
Portanto, ele descobrirá automaticamente o delimitador escolhido?
tempestade em
11
Sim. O caractere após o sé considerado o delimitador. Não consigo descobrir onde encontrei uma lista na documentação, mas tenho quase certeza de que pelo menos /:;*%@#são válidas.
Cascabel
Isso é útil ao substituir \ em / em um arquivo com vários caminhos no estilo do Windows. Obrigado.
Isaac Nequittepas
Para obter essa mensagem na documentação, use: h e146
jcollado
Não tinha ideia que você poderia alterar o delimitador! Isso é enorme - obrigado.
Brettins
22
%s:<dog/>:<cat>

Você pode substituir os delimitadores / se eles se tornarem incômodos para certos padrões.

Sarah
fonte
3
+1 para :delimitador. Eu não sabia que você poderia usar isso. Eu sempre usei @em tempos de 'confusão de fuga'
Jeffrey Jose
8

Cite-os com uma barra invertida. Além disso, geralmente ajuda usar outro delimitador além da barra.

 :%s#<dog/>#<cat\\>#

ou se você tiver que usar barra como o delimitador de comando substituto

 :%s/<dog\/>/<cat\\>/
Wallyk
fonte
3

A sintaxe é:

:%s/<dog\/>/<cat\\>/g
Maurizio Reginelli
fonte
2

Eu estava procurando algo semelhante, para pesquisar valores de registro contendo o /caractere (para gravar uma macro). A solução foi pesquisar usando o ?token em vez do /.

Fernando
fonte
Observe que ?fará uma pesquisa para trás, e não é o mesmo.
Martin Tournoij
-1

barra invertida barra invertida estrela

/(<- the prompt)\/\*

então, depois que você digita, parece

/\/\*
Jim k
fonte
1
Em que essa resposta difere das que estão no site há quase seis anos?
Martin Tournoij