O que significa substituir barras (/) por pontos de exclamação (!) Em um comando substituto?

13

Vi recentemente um comando substituto em que o autor foi /substituído por um !como este::s!abc!ABC!g

Tentei encontrar alguma documentação sobre esse uso, mas não encontrei nada relevante. Então, tentei experimentar sozinho e mais uma vez não consegui descobrir a diferença real entre os dois sinais. Aqui está o que eu encontrei:

  • Não é possível misturar !e /em um comando. Por exemplo, :s!abc/ABCfalha.
  • Pode ser útil usar !para evitar escapar de /um padrão. Por exemplo, se eu quiser substituir </por %, posso usar em :%s!</!%!gvez de :%s/<\//%/g.
  • Parece que, em alguns casos, algum regex não funcionará /e funcionará corretamente, !mas como eu não sou um especialista em regex, não tenho certeza disso.

Portanto, minha pergunta é simples: qual é a vantagem de usar !em um comando substituto e quando devo decidir usá-lo em vez de /?

statox
fonte
Esta questão também
Martin Tournoij
De fato, fiz um post duplo por engano, sinalizei-o alguns minutos atrás para saber o que devo fazer.
statox

Respostas:

22

De :help :global:

Em vez do '/' que envolve o {pattern}, você pode usar qualquer outro caractere de byte único, mas não um caractere alfabético, '\', '"' ou '|'. Isso é útil se você deseja incluir um '/' em o padrão de pesquisa ou a sequência de substituição.

Como você já planejou com suas experiências, isso é para evitar a chamada " síndrome do palito de dente inclinado ". Considere isto:

:%s/\/home\/martin\/test/\/home\/jake\/x/

versus:

:%s!/home/martin/test!/home/jake/x!

A segunda forma é obviamente muito mais legível.

Essa é a única razão pela qual você pode alterar o delimitador; para torná-lo mais legível para nós, seres humanos. O computador não se importa.

Alguns outros programas são ainda mais flexíveis, a propósito, no GNU, sedpor exemplo, você pode usar xcomo delimitador, se desejar. sed sxaxbxg fileé o mesmo que sed s/a/b/g file.

Martin Tournoij
fonte
Quanto à legibilidade, eu prefiro (e sugiro) :%s@/home/martin/test@/home/jake/x@, pois a "gordura" @torna ainda mais fácil ver onde as partes individuais da declaração começam / terminam.
DevSolar
@DevSolar achei :%s#/home/martin/test#/home/jake/x#trabalhos ainda melhores, mas isso é apenas opinião pessoal.
Amit Gold