Немного потрудившись, выясняется, что 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 используется для того, чтобы сделать замены глобальными; Вы можете пропустить это, если хотите заменить только первый экземпляр в каждой строке.
Вы можете, вероятно, решить, как складывать разные числа, вычитать, делить и т.д.