Немного потрудившись, выясняется, что 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\+которым следует любое количество цифр. \(И \)там , чтобы установить всю эту последовательность цифр в качестве одной Изотерм бывшей группы , которая будет соответствовать как обратные ссылки \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используется, чтобы сделать замены глобальными; Вы можете опустить это, если хотите заменить только первый экземпляр в каждой строке.
Вы можете, вероятно, решить, как складывать разные числа, или вычитать, или делить, и т. Д.
vimиemacsмогу делать такие вещи, но это может потребовать написания сценария, а не использования одной команды.