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