Co to znaczy zastąpić ukośniki (/) wykrzyknikami (!) W poleceniu zastępczym?

13

Ostatnio widziałem polecenie zastępcze, w którym autor /zastąpił !podobny::s!abc!ABC!g

Próbowałem znaleźć dokumentację na temat tego użycia, ale nie znalazłem nic istotnego. Próbowałem więc eksperymentować sam i po raz kolejny nie mogłem zrozumieć prawdziwej różnicy między tymi dwoma znakami. Oto, co znalazłem:

  • To nie jest możliwe, aby wymieszać !i /w poleceniu. Na przykład :s!abc/ABCzawodzi.
  • Przydatne może być użycie, !aby uniknąć ucieczki /wzoru. Na przykład, jeśli chcę wymienić </ze %mogę użyć :%s!</!%!gzamiast :%s/<\//%/g.
  • Wygląda na to, że w niektórych przypadkach niektóre wyrażenia regularne nie będą działać /i będą działać poprawnie, !ale ponieważ tak naprawdę nie jestem ekspertem od wyrażeń regularnych, nie jestem tego pewien.

Więc moje pytanie jest proste: Jaka jest zaleta używania !polecenia zastępczego i kiedy powinienem zdecydować się go użyć /?

statox
źródło
To pytanie zostało również wysłane do Stack Overflow
Martin Tournoij
Rzeczywiście przez pomyłkę napisałem podwójny post, oflagowałem go kilka minut temu, aby wiedzieć, co powinienem zrobić.
statox

Odpowiedzi:

22

Od :help :global:

Zamiast otaczającego „/” {pattern}możesz użyć dowolnego innego jednobajtowego znaku, ale nie znaku alfabetycznego „\”, „” lub „|”. Jest to przydatne, jeśli chcesz dołączyć „/” w wzorzec wyszukiwania lub ciąg zastępujący.

Jak już wymyśliłeś ze swoich eksperymentów, ma to na celu zapobieganie tak zwanemu „ zespołowi pochylonej wykałaczki ”. Rozważ to:

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

przeciw:

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

Druga forma jest oczywiście o wiele bardziej czytelna.

To jedyny powód, dla którego możesz zmienić ogranicznik; aby uczynić go bardziej czytelnym dla nas ludzi. Komputer nie dba o to.

Nawiasem mówiąc, niektóre inne programy są jeszcze bardziej elastyczne, sedna przykład w GNU możesz użyć xjako separatora, jeśli chcesz. sed sxaxbxg filejest taki sam jak sed s/a/b/g file.

Martin Tournoij
źródło
Jeśli chodzi o czytelność, wolę (i sugeruję) :%s@/home/martin/test@/home/jake/x@, ponieważ „gruby” @sprawia, że ​​jeszcze łatwiej jest zobaczyć, gdzie poszczególne części instrukcji zaczynają / kończą.
DevSolar,
@DevSolar Uważam, że :%s#/home/martin/test#/home/jake/x#działa jeszcze lepiej, ale to tylko osobista opinia.
Amit Gold