Рассмотрим, например, следующую строку
'{"place":"buddy's home"}'
Я хочу заменить одинарную кавычку только в buddy's
. Одиночные кавычки в начале и в конце строки должны быть без изменений. Так будет выглядеть получившаяся линия.
'{"place":"buddy\'s home"}'
Может быть несколько строк с несколькими вхождениями таких одинарных кавычек в каждую строку. Мне нужно избежать их всех, кроме начала и конца строки.
Я могу найти такой шаблон с помощью vim regex :/.'.
. Этот шаблон гарантирует, что одинарная кавычка окружена двумя символами, а не в начале или в конце строки. Но у меня проблемы с заменой y's
на y\'s
во всех местах.
Если регулярное выражение .'.
достаточно точное, вы можете заменить все вхождения на:
:%s/.\zs'\ze./\\'/g
Вместо использования \ze
и \zs
вы также можете использовать группы (...)
. Однако я считаю эту версию немного более читаемой.
См. :h /\zs
и :h /\ze
для получения дополнительной информации.
:%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
.