Ответ 1
Вы должны использовать normal
для выполнения команд нормального режима в командном режиме:
:g/searchString/ normal ^A
Обратите внимание, что вам нужно нажать Ctrl - V Ctrl - A, чтобы получить символ ^A
.
В нормальном режиме (в Vim), если курсор находится на номере, нажатие Ctrl - A увеличивает число на 1. Теперь я хочу сделать то же самое, но из командной строки. В частности, я хочу перейти к определенным строкам, первый символ которых является числом, и увеличивать его, т.е. Я хочу запустить следующую команду:
:g/searchString/ Ctrl-A
Я попытался сохранить Ctrl - A в макросе (скажем a
) и используя :g/searchString/ @a
, но получаю сообщение об ошибке:
E492: Не команда редактора ^ A
Любые предложения?
Вы должны использовать normal
для выполнения команд нормального режима в командном режиме:
:g/searchString/ normal ^A
Обратите внимание, что вам нужно нажать Ctrl - V Ctrl - A, чтобы получить символ ^A
.
Как и трюк :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
)
Я уверен, что вы можете сделать это с помощью 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