Після того, як трішки побігати, виявляється, що 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\+, яке є будь-якою кількістю цифр. The \(and \)are there, щоб встановити всю цю послідовність цифр як єдину групу reg reg, яка б відповідала зворотним посиланням на зразок \1, або submatchкоманді vim .
Потім роздільник @відзначає те, що випливає з тексту заміни.
Тут \=на початку означає підміняти результат деяким оціненим виразом, а не reg ex шаблоном або рядком, що є ключовим тут.
Тоді ми маємо '<obj param="'для початку текст заміни. Далі .випливає функція vim для об'єднання рядків.
submatch(1)- це вбудована функція vim, яка може бути використана лише в команді підстановки і повертає рядок, такий же, як і регулярний вираз \1; ви б використали submatch(2)для еквівалента регулярних виразів \2тощо. ( \0Це весь ваш смак варіант оформлення, але ми не хочемо , щоб тут) . В \(і \)в шаблоні пошуку використовуються для розмітки , що вважається submatch(1).
Звідси (submatch(1) + 50)виходить результат додавання 50 до числа, яке цифри, що слідують <obj param="у формі пошуку шаблону.
Розмежувач @знову використовується для позначення кінця тексту заміни.
Прапор gвикористовується, щоб зробити заміни глобальними; Ви можете пропустити це, якщо хочете замінити перший екземпляр у кожному рядку.
Ви, мабуть, можете звідти розробити, як додавати різні числа, або віднімати, або ділити тощо.
vimіemacsможе зробити такого роду речі, але це може зажадати написання сценарію , а не з допомогою однієї команди.