Vim: Как заменить несколько экземпляров строки, но только между определенными разделителями в этой строке - PullRequest
2 голосов
/ 27 марта 2019

Это вопрос регулярного выражения.В данном конкретном случае я использую Vim для выполнения этой работы, но меня будет интересовать общий ответ на часть регулярного выражения, в противном случае я использую другие варианты регулярного выражения.

Рассмотрим следующий примергде я хочу заменить некоторую произвольную текстовую строку «ab» другим текстом «cd», но только если это происходит между словами START и END:

Before:
 ab ab ab START ab ab ab END ab ab ab

I would like this to become:
 ab ab ab START cd cd cd END ab ab ab

Могут быть другие слова / текст междувхождения строки "ab", которые я хочу заменить.Неизвестно, сколько раз строка «ab» появляется перед «START», между «START» и «END» и после «END».Это может вообще не отображаться.

Я бы предпочел не разбивать каждую строку в разделителях START и END, делать глобальный s / ab / cd / g только для этой строки, а затем возвращаться к строкам,Существует ли регулярное выражение, которое будет совпадать только с "ab" между разделителями?

Ответы [ 2 ]

3 голосов
/ 27 марта 2019
:%s/START\zs.*\zeEND/\=substitute(submatch(0), 'ab', 'cd', 'g')/
  • \zs и \ze имеют нулевую ширину и ничего не соответствуют. Они просто обозначают начало и конец матча.
  • \= позволяет нам использовать любое выражение (и, следовательно, любую функцию из :h function-list) в команде :s.
  • submatch(0) содержит строку, которую мы только что нашли.
  • Тогда мы substitute() все вхождения ab на cd.

Это стандартный шаблон, который можно использовать разными способами.

Справка:

:h /zero-width
:h /\zs
:h /\ze
:h sub-replace-expression
:h submatch()
:h substitute()
0 голосов
/ 30 марта 2019

Несмотря на возможность регулярного выражения, можно использовать подстановку внутри выделения визуального блока (выберите блок, в который вы хотите подстановку), а затем:

:'<,'>s/\%Vab/cd/g

Объяснение

'<,'> ............. refers to the visual block
s/ ................ substitution
\%V ............... that's the trick, it restricts the substitution
ab ................ old pattern
cd ................ new pattern
g  ................ globally

Для получения дополнительной информации см .: :h /\%V

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