Заменить все вхождения символа между тегами с помощью vim - PullRequest
7 голосов
/ 01 ноября 2011

Мне нужно заменить все вхождения символа / на \ между тегами ... .

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

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

Ответы [ 3 ]

10 голосов
/ 01 ноября 2011

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

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

Объяснение:

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

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

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

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

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

:'<,'>s!\%V/!\\!g
2 голосов
/ 01 ноября 2011

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

Примечание Введите ^M как Cv См ( Cq См в Windows )

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

Хммм, включая подсказку Рэнди об использовании \%V в шаблоне делает это проще:

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

Я проверял оба.Ого.Я сейчас объясню.Удерживать.

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

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

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