Замените все экземпляры символов между тегами на vim

Мне нужно заменить все экземпляры / character на between ... теги.

файл имеет как 2.000 этих тегов, и мне нужно только заменить символ / внутри этих тегов.

Как я могу это сделать?

3 ответов


Edit: учитывая новую информацию, приведенная ниже подстановка, вероятно, будет работать:

:%s/<filename>\zs.\{-}\ze<\/filename>/\=substitute(submatch(0), '\/', '\', 'g')/ 

объяснение:

  • %s: заменить по всему файлу
  • /<filename>: начало шаблона и статического текста, чтобы соответствовать
  • \zs: начало совпадающего текста
  • .\{-}: любой персонаж, не жадный
  • \ze: конец найденного текста
  • <\/filename>/: конец целевого тега и шаблон
  • \=: оцените замену как выражение vim
  • substitute(submatch(0), '\/', '\', 'g')/: заменить все /С \ в найденный текст.

оригинальный ответ:

Я собираюсь предположить, что вы имеете в виду теги XML-стиля здесь. Что бы я сделал, это визуально выбрать область, которую вы хотите оперировать, а затем использовать \%V regex atom, чтобы работать только с этим выбором.

vit:s!\%V/!\!g

должен сделать трюк. Заметить что при нажатии :, vim автоматически добавит диапазон для визуального выбора, фактическая команда подстановки будет выглядеть так:

:'<,'>s!\%V/!\!g

если мы можем предположить, что теги находятся на одной строке, это просто:

Примечание Enter ^M as C-vC-m (C-qC-m на windows)

:g/<filename>/norm! /filename>/e^Mvity:let @"=substitute(@", '/', '\', "g")^Mgvp

hmmm интеграция подсказки Рэнди при использовании \%V в шаблоне упрощает:

:g/<filename>/norm! /filename>/e^Mvit:s#\%V/#\#g^M

Я проверил оба. Охать. Сейчас объясню. Держаться.

  1. :g/<filename>/ - _Для каждой строки, содержащей <filename>
  2. norm! - _execute обычные команды (игнорирование сопоставлений)
  3. /filename/eEnterперейти к концу открытого тега
  4. vit - выберите внутренний текст из этого тега в визуальном режиме
  5. :s#\%V/#\#gEnter - _ на этом визуальном выделении выполните подстановку (replace \ by /)

VIM имеет резкую кривую обучения, как и regex. Я верю, что эта команда сделает это. Вы должны избежать каждого символа с"\".

:%s/\//\/g