2013-06-04 2 views
3

Скажем, у меня есть файл конфигурации, и каждая строка содержит значения, разделенные пробелами. В столбце у меня только нули. Пример:Как увеличить число номеров в одной строке в файле конфигурации?

... # there is more configuration before the interesting stuff: 
0 0 file /dev/stdin 224.0.68.54:12131 
0 0 file /dev/stdin 224.0.68.55:12102 
0 0 file /dev/stdin 224.0.68.49:12333 
0 0 file /dev/stdin 224.0.68.60:12184 
0 0 file /dev/stdin 224.0.68.62:12888 
0 0 file /dev/stdin 224.0.68.77:12001 
0 0 file /dev/stdin 224.0.68.33:12973 

Теперь я хочу увеличить второй столбец индексом. , что я хочу этот результат:

0 0 file /dev/stdin 224.0.68.54:12131 
0 1 file /dev/stdin 224.0.68.55:12102 
0 2 file /dev/stdin 224.0.68.49:12333 
0 3 file /dev/stdin 224.0.68.60:12184 
0 4 file /dev/stdin 224.0.68.62:12888 
0 5 file /dev/stdin 224.0.68.77:12001 
0 6 file /dev/stdin 224.0.68.33:12973 

Как к тому, что в Emacs Lisp? Или любой другой способ сделать это, пожалуйста?

+0

при достижении "10" линия должна получить один символ больше? –

+0

@PeterMiehle да это. –

ответ

7

Вы можете использовать макрос с счетчиком, чтобы сделать это. Вы начинаете определять макрос с F3 и заканчиваете определение с помощью F4. Определяя макрос, нажатие F3 снова введет значение счетчика и увеличит его. После определения макроса запустите его, нажав F4.

Так что в вашем случае движение точки в начале первой интересной линии, нажмите F3CfCfCdF3CnCaF4 (т.е. удалить второй ноль, вставьте счетчик и перейдите в начало следующей строки). Затем нажмите F4 столько раз, сколько необходимо, чтобы изменить все линии.

Если вам нужно изменить значение счетчика, используйте M-x kmacro-set-counter.

+0

Хорошо, это хороший ответ. Я не знал, что трюки F3 имеют приращенный счетчик при определении макроса. Thnx для этого. Кстати, я бы использовал M-D вместо C-D. Потому что у меня может быть число дольше, чем один символ. Мой пример был неясно, так как ваш ответ совершенно верен :) –

+0

Для справки: F3 не работал для меня. Но C-x C-k C-i ('kmacro-insert-counter ') был! :) –

5

Вы можете использовать возможность поиска и замены с помощью вычисляемого выражения:

  • поставил точку на первой линии для обработки
  • Mx запрос замены-регулярное_выражение RET
  • найденная строка: ^0 \([0-9]+\)
  • заменить на: \,(format "0 %s" (+ \#1 \#))

Смысл:

  • поиск номера предшествует одной нуль в начале строки
  • заменить в результате оценки, где \#1 является первым соответствием группы (например, \ 1, но преобразуется в число), а \# - это количество уже выполненных замен (начинается с 0 для первой замены). Выражение оценивается для каждого совпадения.

Если первое число не всегда равно нулю, я хотел бы использовать:

  • искали строку: ^\([0-9]+\) \([0-9]+\)
  • заменить: \,(format "%s %s" \#1 (+ \#2 \#))
4

Что-то вы могли бы сделать с помощью org-mode (Я не уверен, как вы будете использовать результат, но это может быть одним из способов сделать это)

| N | X | file | stream  |    ip | 
|---+---+------+------------+-------------------| 
| 0 | 0 | file | /dev/stdin | 224.0.68.54:12131 | 
| 0 | 1 | file | /dev/stdin | 224.0.68.55:12102 | 
| 0 | 2 | file | /dev/stdin | 224.0.68.49:12333 | 
| 0 | 3 | file | /dev/stdin | 224.0.68.60:12184 | 
| 0 | 4 | file | /dev/stdin | 224.0.68.62:12888 | 
| 0 | 5 | file | /dev/stdin | 224.0.68.77:12001 | 
| 0 | 6 | file | /dev/stdin | 224.0.68.33:12973 | 
#+TBLFM: [email protected]#-2 

Некоторые объяснения, или, вернее, как получить исходные данные и преобразовать его в эту таблицу:

  • скопировать данные в файл config.org

  • Создание таблицы с помощью базовой замены строки команды. (Просто скопируйте текст, как вы его сейчас, выберите все эти и затем Cc |)

  • #+TBLFM: часть «формула» для этой таблицы, это означает следующее: присвоить каждую клетку второй столбец - порядковый номер его строки минус 2 (они начинают подсчитывать строки в 1, и эта таблица имеет строку заголовка).

  • Всякий раз, когда вы Cc Cc по формуле, она будет повторно применить его к столу (так что вы можете добавить несколько строк в изменении документа, повторное формула будет автоматически обновлять таблицу.)

+0

Это более удобный метод. –

2

Вы можете использовать cua-set-rectangle-mark.

Оценка:

(cua-mode 't) 

Затем в буфере можно использовать M-x cua-set-rectangle-mark во второй колонке затем расширить прямоугольник вниз до конца списка.

Затем используйте M-n (последовательность), по умолчанию из Start (0):, Increment (1): и Format (%d): все обеспечивают то, что вам нужно в этом случае.

+0

Я вообще рекомендую иметь 'cua-selection-mode' навсегда - вы получаете хорошие функции прямоугольника, доступные по умолчанию, без всех файлов cut/copy/paste. – phils

3

Как и в случае с ответом Джонатана Лича-Пепина, вы также можете использовать команды редактирования прямоугольника без сочетания (хотя и в два шага вместо одного).

  • Установить знак и указывают на углах прямоугольника колонны
  • С-хгк, чтобы удалить прямоугольник.
  • С-уС-хгN, чтобы вставить последовательность цифр на своем месте.

Также см родственный вопрос:
emacs string-insert-rectangle vector of numbers?

Смежные вопросы