У меня есть большой XML-файл
<obj param="2542">
<obj param="2333">
<obj param="6433">
Я должен увеличить все значения "param" на некоторое число. Я могу соответствовать числам, в которых я нуждаюсь с поиском regexp во многих редакторах, но как применить некоторую математику к замене?
После немного большего количества ввода по абсолютному адресу вокруг, оказывается, что энергия может сделать это с единственной командой без сценариев. Например, для добавления 50 ко всем числам после <obj param="
Вы могли использовать:
:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g
Позвольте мне сломать это.
:
общий путь состоит в том, чтобы ввести/показать режим командной строки в энергию.
%
средства в рамках целого документа; Вы могли вставить диапазон числа, например, 1,50
просто сделать это в первых 50 строках вместо этого.
s
сокращение от замены (можно выписать целое слово, если Вы предпочитаете),
@
разделитель; Вы могли использовать любой другой символ, пока это не находится в том, что Вы ищете. Просто используйте его три раза. (Синтаксис подобен sed
.)
Все до следующего возникновения разделителя является reg исключая шаблоном для поиска в этом случае <obj param="
сопровождаемый \d\+
, который является любым количеством цифр. \(
и \)
есть ли для установки этой всей последовательности цифр как единственный reg исключая группой, которая соответствовала бы обратным ссылкам как \1
, или энергия submatch
команда.
Затем разделитель @
метки это, что следует как текст замены.
\=
вначале здесь средства заменить результатом некоторого оцененного выражения, а не reg исключая шаблоном или строкой, которая является ключевой здесь.
Затем мы имеем '<obj param="'
для запуска текста замены. .
то, которое следует, является функцией энергии для конкатенации строк.
submatch(1)
встроенная функция энергии, которая может использоваться только в рамках команды замены и возвращает строку, которая совпадает с regex \1
; Вы использовали бы submatch(2)
для эквивалента regex's \2
и так далее. (\0
целый подобранный шаблон, но мы не хотим это здесь.) \(
и \)
в шаблоне поиска используются для отделения что количества как submatch(1)
.
Следовательно (submatch(1) + 50)
дает результат добавления 50 к числу который цифры после <obj param="
в форме шаблона поиска.
Разделитель @
снова используется для отделения конца текста замены.
Флаг g
используется для создания замен глобальными; Вы могли опустить это, если бы Вы только хотели заменить первую инстанцию на каждой строке.
Можно, вероятно, работать из там, как добавить различные числа, или вычесть или разделиться и т.д.
В Emacs (начиная с версии 23): использовать \,
выполнять произвольный код Lisp в regexp замене. Например, для возведения в квадрат чисел Вы могли использовать
M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"
В Vim: запустите свой текст замены с \=
(см. :help sub-replace-special
). Например, для возведения в квадрат чисел:
s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!
Несколько редакторов позволяют Вам делать такого рода вещи с макросами: определите макрос, который 1. ищет следующее соответствие и 2. выполняет замену (использующий внешний инструмент для арифметики при необходимости); повторяйте макрос так много раз, как у Вас есть соответствия.
Можно использовать энергию, чтобы сделать это для Вас. Просто откройте свой файл и запишите макрос. Пример: Поиск любого числа
/[0-9]{1,}
затем нажмите q, и (храните макрос в регистре a). После этого нажмите Ctrl-X (увеличивающий число 1) и нажмите n (для следующего результата поиска) впоследствии. После выполнения этого нажмите q снова для сохранения макроса. Теперь можно применить макрос к следующему числу путем нажатия +a. Это изменит текущее число и переходы к следующему. Путем повторения, что или использование x@a, можно повторить это x времена.
Ну, то описание не может быть достаточным, чтобы показать, как оно может быть сделано. Просто обратитесь к учебному руководству, описывающему макро-механизм в энергии.