Подтвердить что ты не робот

Использование Ctrl-A в командной строке Vim для увеличения числа

В нормальном режиме (в Vim), если курсор находится на номере, нажатие Ctrl - A увеличивает число на 1. Теперь я хочу сделать то же самое, но из командной строки. В частности, я хочу перейти к определенным строкам, первый символ которых является числом, и увеличивать его, т.е. Я хочу запустить следующую команду:

:g/searchString/ Ctrl-A

Я попытался сохранить Ctrl - A в макросе (скажем a) и используя :g/searchString/ @a, но получаю сообщение об ошибке:

E492: Не команда редактора ^ A

Любые предложения?

4b9b3361

Ответ 1

Вы должны использовать normal для выполнения команд нормального режима в командном режиме:

:g/searchString/ normal ^A

Обратите внимание, что вам нужно нажать Ctrl - V Ctrl - A, чтобы получить символ ^A.

Ответ 2

Как и трюк :g//normal, отправленный CMS, если вам нужно сделать это с помощью более сложного поиска, чем просто найти номер в начале строки, вы можете сделать что-то вроде этого:

:%s/^prefix pattern\zs\d\+\zepostfix pattern/\=(submatch(0)+1)

В качестве объяснения:

:%s/X/Y            " Replace X with Y on all lines in a file
" Where X is a regexp:
^                  " Start of line (optional)
prefix pattern     " Exactly what it says: find this before the number
\zs                " Make the match start here
\d\+               " One or more digits
\ze                " Make the match end here
postfix pattern    " Something to check for after the number (optional)

" Y is:
\=                 " Make the output the result of the following expression
(
    submatch(0)    " The complete match (which, because of \zs and \ze, is whatever was matched by \d\+)
    + 1            " Add one to the existing number
)

Ответ 3

Я уверен, что вы можете сделать это с помощью vim в командной строке. Но здесь альтернатива,

$ cat file
one
2two
three

$ awk '/two/{x=substr($0,1,1);x++;$0=x substr($0,2)}1' file #search for "two" and increment
one
3two
three