Замените все экземпляры символов между тегами на 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
Я проверил оба. Охать. Сейчас объясню. Держаться.
-
:g/<filename>/- _Для каждой строки, содержащей<filename> -
norm!- _execute обычные команды (игнорирование сопоставлений) -
/filename/eEnterперейти к концу открытого тега -
vit- выберите внутренний текст из этого тега в визуальном режиме -
:s#\%V/#\#gEnter - _ на этом визуальном выделении выполните подстановку (replace\by/)
VIM имеет резкую кривую обучения, как и regex. Я верю, что эта команда сделает это. Вы должны избежать каждого символа с"\".
:%s/\//\/g