Экранирование одинарной кавычки для определенного шаблона с помощью vim

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

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

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

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

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

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

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
356
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

:%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.

Другие вопросы по теме