Экранирование одинарной кавычки для определенного шаблона с использованием vim - PullRequest
0 голосов
/ 25 октября 2018

Рассмотрим следующую строку, например:

'{"place":"buddy's home"}'

Я хочу заменить одиночную кавычку только на buddy's.Одиночные кавычки в начале и конце строки должны быть целыми.Таким образом, результирующая строка будет выглядеть так:

'{"place":"buddy\'s home"}'

Может быть несколько строк с несколькими вхождениями таких одинарных кавычек в каждой строке.Мне нужно избегать их всех, кроме как в начале и в конце строки.

Я могу найти такой шаблон, используя vim regex :/.'. Этот шаблон гарантирует, что одинарные кавычки будут окружены двумя символами и будутне в начале или в конце строки.Но у меня проблемы с тем, как заменить y's на y\'s во всех местах.

Ответы [ 2 ]

0 голосов
/ 25 октября 2018
:%s/\(.\)'\(.\)/\1\\'\2/gc
  • :%s/ заменить по всему буферу (см. :help range, чтобы объяснить %)
  • \(.\) совпадение с символом и сохранить его в группе захвата 1 (см.:help \()
  • ' литерал '
  • \(.\) сопоставить символ и сохранить его в группе захвата 2
  • / заменить на
  • \1 группа захвата 1 (см. :help \1)
  • \\' это \' (вам нужно избежать обратной косой черты)
  • \2 группа захвата2
  • /gc заменить глобально (вся строка) и запросить подтверждение (см. :help :s_flags)

Вы можете опустить опцию c, если вы уверены, что все заменяет


Как говорит kongo2002 в своем ответе, вы можете заменить группы захвата на \zs и \ze:

  • \zs начнет матч и откажется от всего до
  • \ze завершит матч и откажется от всего после

См. :help \ze и :help \zs.

0 голосов
/ 25 октября 2018

Если регулярное выражение .'. является достаточно точным, то вы можете заменить все вхождения на:

:%s/.\zs'\ze./\\'/g

Вместо использования \ze и \zs вы также можете использовать группы (...).Однако я нахожу эту версию немного более читабельной.

См. :h /\zs и :h /\ze для получения дополнительной информации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...