Подтвердить что ты не робот

Emacs: добавление 1 к каждому номеру из 2 цифр внутри отмеченной области

Представьте, что в текстовом файле, открытом в Emacs, есть следующее:

some    34
word    30
another 38
thing   59
to      39
say     10
here    47

и я хочу включить это, добавив 1 к каждому номеру из 2-х цифр:

some    35
word    31
another 39
thing   60
to      40
say     11
here    48

(это краткий пример, моя настоящая потребность в гораздо большем списке, а не на моем вызове)

Как я могу сделать это из Emacs?

Я не против вызывать внешнюю магию Perl/sed/whatever, пока вызов выполняется непосредственно из Emacs и работает только в отмеченной области, которую я хочу.

Как бы вы автоматизировали это из Emacs?

Я думаю, что ответ, о котором я думаю, состоит в вызове shell-command-on-region и замене области на выход... Но я не уверен, как конкретно это сделать.

4b9b3361

Ответ 1

Это можно решить, используя команду query-replace-regexp (привязанная к C-M-%):

C-M-% \b[0-9][0-9]\b return \,(1+ \#&)

Выражение, которое следует за \,, будет оцениваться как выражение Lisp, результат которого используется как строка замены. В выражении Lisp, \#& будет заменен на соответствие строке, интерпретируемой как число.

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

  • Если включен режим переходных меток, вам просто нужно выбрать регион обычно (используя точку и отметку);
  • Если по какой-то причине вам не нравится режим переходных меток, вы можете использовать узкую область для ограничения изменений в определенном регионе: выберите область с использованием точки и метки, C-x n n, чтобы сузить, выполнить query-replace-regexp, как описано выше, и, наконец, C-x n w для расширения. (Спасибо Джастину Смиту за этот намек.)
  • Используйте мышь, чтобы выбрать регион.

Подробнее см. в разделе Regexp Replacement руководства Emacs.

Ответ 2

Emacs режим редактирования столбцов - это то, что вам нужно.

  • Активируйте его ввод M-x cua-mode.

  • Перейдите к началу прямоугольника (оставьте курсор на символе 3) и нажмите C-RET.

  • Перейдите в конец прямоугольника (оставьте курсор на символе 7). Вы будете работать в выделенной области.

  • Теперь нажмите M-i, который увеличивает все значения в регионе.

Вы закончили! удалить мертвые ссылки ImageShack

Ответ 3

Он не защищает от 99- > 100.

(defun add-1-to-2-digits (b e)
  "add 1 to every 2 digit number in the region"
  (interactive "r")
  (goto-char b)
  (while (re-search-forward "\\b[0-9][0-9]\\b" e t)
    (replace-match (number-to-string (+ 1 (string-to-int (match-string 0)))))))

О, и он работает в регионе. Если вы хотите весь файл, то вы заменяете b и e на (point-min) и nil.

Ответ 4

умеренно протестировано; используйте M-: и выполните следующую команду:

(while (re-search-forward "\\<[0-9][0-9]\\>" nil t) (let ((x (match-string 0))) (delete-backward-char 2) (insert (format "%d" (1+ (string-to-int x))))))

Ответ 5

Мне удалось заставить его работать по-другому, используя следующее (мой awk-fu не силен, поэтому, вероятно, это можно сделать проще):

C-u M-x shell-command-on-region RET awk '$2>=0&&$2<=99 {$2++} {print}' RET

но я потерял свой отступ в процессе:)

Увидев все эти ответы, я не могу не уважать Emacs...