На этой странице уже есть три отличных ответа , но, как предложил Люк Эрмитт в комментарии , если вы делаете это не по назначению, важно то, как быстро и легко вы сможете найти работающее решение.
Таким образом, это проблема, которую я бы вообще не использовал :substitute
: эту проблему легко решить, используя обычные команды нормального режима и рекурсивный макрос:
(При необходимости) Во- первых, выключите 'wrapscan'
. Регулярное выражение мы будем использовать , будет соответствовать нужный текст результата, а также исходный текст, так и с 'wrapscan'
на макрос в противном случае продолжить воспроизведение бы навсегда. (Или пока вы не поймете , что происходит , и нажмите <C-C>
.):
:set nowrapscan
Настройка условия поиска (используя то же базовое регулярное выражение уже упоминалась в существующих ответах):
/#\d\+\(\.\d\+\)\?<CR>
(При необходимости) вернуться к первому совпадению, нажав N
столько раз, сколько требуется,
(При необходимости) Измените первое совпадение на нужный текст:
cE#1<Esc>
Очистите "q
регистр и начните запись макроса:
qqqqq
Вырвать текущий счетчик:
yiW
Перейти к следующему матчу:
n
Замените текущий счетчик на тот, который мы только что дернули:
vEp
Увеличить счетчик:
<C-A>
Играть в макрос q
. Регистр "q
все еще пуст, потому что мы очистили его на шаге 5, поэтому на этом этапе ничего не происходит:
@q
Прекратить запись макроса:
q
Играй в новый макрос и смотри!
@q
Как и во всех макросах, это выглядит как множество шагов при объяснении, как я делал выше, но учтите, что на самом деле их ввод очень быстро: кроме рекурсивного макроса-записи-шаблона они все просто обычные команды редактирования я выполняю все время во время редактирования. Единственный шаг, где я должен был сделать что-либо, даже приближающееся к мышлению, - это шаг 2, где я написал регулярное выражение для выполнения поиска.
Отформатированная в виде двух команд режима командной строки и серии нажатий клавиш, скорость решения этого типа становится более ясной: я могу придумать следующее почти так же быстро, как и набрать его 1 :
:set nowrapscan
/#\d\+\(\.\d\+\)\?
cE#1<Esc>qqqqqyiWnvEp<C-A>@qq@q
Я, вероятно, мог бы придумать другие решения на этой странице, немного подумав и сославшись на документацию 2 , но, как только вы поймете, как работают макросы, их действительно легко использовать с любой скоростью, которую вы обычно редактируете.
1: Там являются ситуации , когда макросы требуют больше мысли, но я считаю , что они не придумали много на практике. И, как правило, ситуации, в которых они возникают, - это единственное практическое решение , где используется макрос .
2: Не подразумевать, что другие ответчики не могли бы предложить свои решения так же легко: им просто нужны навыки / знания, которые лично у меня не так легко у меня под рукой. Но все пользователи Vim знают, как использовать обычные команды редактирования!
perldo
, вы можете использовать:%perldo s/#\K\d+(\.\d+)?/++$i/ge