Немного потрудившись, выясняется, что vim может сделать это одной командой без сценариев. Например, чтобы добавить 50 ко всем числам, следующим за <obj param="
вы можете использовать:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Позвольте мне сломать это.
:
это общий способ войти / показать режим командной строки в vim.
%
означает в рамках всего документа; Вы можете ввести диапазон чисел, например, 1,50
чтобы сделать это в первых 50 строках.
s
является сокращением от замены (вы можете написать целое слово, если хотите)
@
- разделитель; Вы можете использовать любой другой символ, если он не в том, что вы ищете. Просто используйте это три раза. (Синтаксис похож на sed
.)
Все до следующего вхождения разделителя @ является шаблоном reg ex для поиска, в данном случае <obj param="
за которым следует \d\+
, что является любым количеством цифр. \(
И \)
предназначены для установки всей этой последовательности цифр в виде одной группы reg ex, которая будет соответствовать обратным ссылкам, таким как \1
, или команде vim submatch
.
Затем разделитель @
помечает то, что следует за текстом замены.
\=
В начале здесь означает замену результата некоторого вычисляемого выражения, а не шаблона или строки reg ex, которые здесь являются ключевыми.
Тогда у нас есть '<obj param="'
для начала замещающего текста. .
Далее следует функция vim для объединения строк.
submatch(1)
- это встроенная функция vim, которая может использоваться только внутри команды подстановки и возвращает строку, которая совпадает с регулярным выражением \1
; вы бы использовали submatch(2)
для эквивалента регулярного выражения \2
и так далее. (\0
- это весь сопоставленный шаблон, но мы не хотим этого здесь.) \(
И \)
в шаблоне поиска используются, чтобы отметить то, что считается submatch(1)
.
Следовательно (submatch(1) + 50)
дает результат прибавления 50 к числу, за которым следуют цифры после <obj param="
в форме шаблона поиска.
Разделитель @
снова используется для выделения конца текста замены.
Флаг g
используется для того, чтобы сделать замены глобальными; Вы можете пропустить это, если хотите заменить только первый экземпляр в каждой строке.
Вы можете, вероятно, решить, как складывать разные числа, вычитать, делить и т.д.