Какой-либо текстовый редактор, который может применить некоторую математику к тексту замены?

У меня есть большой XML-файл

<obj param="2542">
<obj param="2333">
<obj param="6433">

Я должен увеличить все значения "param" на некоторое число. Я могу соответствовать числам, в которых я нуждаюсь с поиском regexp во многих редакторах, но как применить некоторую математику к замене?

15
задан 11.07.2012, 10:25

3 ответа

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

Можно, вероятно, работать из там, как добавить различные числа, или вычесть или разделиться и т.д.

18
ответ дан 07.12.2019, 11:03

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

7
ответ дан 07.12.2019, 11:03

Можно использовать энергию, чтобы сделать это для Вас. Просто откройте свой файл и запишите макрос. Пример: Поиск любого числа

/[0-9]{1,}

затем нажмите q, и (храните макрос в регистре a). После этого нажмите Ctrl-X (увеличивающий число 1) и нажмите n (для следующего результата поиска) впоследствии. После выполнения этого нажмите q снова для сохранения макроса. Теперь можно применить макрос к следующему числу путем нажатия +a. Это изменит текущее число и переходы к следующему. Путем повторения, что или использование x@a, можно повторить это x времена.

Ну, то описание не может быть достаточным, чтобы показать, как оно может быть сделано. Просто обратитесь к учебному руководству, описывающему макро-механизм в энергии.

1
ответ дан 07.12.2019, 11:03

Теги

Похожие вопросы