Что значит заменить косую черту (/) восклицательными знаками (!) В команде замены?

13

Недавно я увидел команду замещения, где автор /заменил ее !следующим образом::s!abc!ABC!g

Я попытался найти некоторую документацию по этому использованию, но я не смог найти ничего уместного. Поэтому я попытался поэкспериментировать сам и еще раз не смог понять реальную разницу между этими двумя знаками. Вот что я нашел:

  • Не возможно смешивать !и /в команде. Например :s!abc/ABCне удается.
  • Это может быть полезно, чтобы !избежать экранирования /в шаблоне. Например, если я хочу заменить </на, %я могу использовать :%s!</!%!gвместо :%s/<\//%/g.
  • Кажется, что в некоторых случаях некоторые регулярные выражения не будут работать /и работать должным образом, !но, поскольку я на самом деле не эксперт по регулярным выражениям, я не уверен в этом.

Поэтому мой вопрос прост: в чем преимущество использования !замещающей команды и когда я должен решить использовать ее вместо /?

statox
источник
Этот вопрос был также отправлен в Stack Overflow
Martin Tournoij
Действительно, я сделал двойной пост по ошибке, я пометил его несколько минут назад, чтобы знать, что я должен делать.
statox

Ответы:

22

От :help :global:

Вместо «/», которое окружает {pattern}, вы можете использовать любой другой однобайтовый символ, но не алфавитный символ, «\», «» или «|». Это полезно, если вы хотите включить «/» в шаблон поиска или строка замены.

Как вы уже разработали из своих экспериментов, это должно предотвратить так называемый « синдром наклоняющейся зубочистки ». Учти это:

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

против:

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

Вторая форма, очевидно, намного более читабельна.

Это единственная причина, по которой вы можете изменить разделитель; чтобы сделать его более читаемым для нас, людей. Компьютер не заботится.

Кстати, некоторые другие программы еще более гибкие, sedнапример , в GNU вы можете использовать их xкак разделитель, если хотите. sed sxaxbxg fileтак же, как sed s/a/b/g file.

Мартин Турной
источник
Что касается читабельности, я предпочитаю (и предлагаю) :%s@/home/martin/test@/home/jake/x@, так как «жирный» @делает еще проще увидеть, где начинаются / заканчиваются отдельные части утверждения.
DevSolar
@DevSolar Я нашел :%s#/home/martin/test#/home/jake/x#работы еще лучше, но это только личное мнение.
Амит Голд