Предварительный символ N, за которым следуют номера строк - PullRequest
4 голосов
/ 20 апреля 2010

Я вручную редактирую текстовые файлы Gcode с ЧПУ, и мне нужен способ указания мест в файле и на траектории. Я хочу изменить каждую строку в текстовом файле так, чтобы она начиналась с символа N в верхнем регистре, за которым следуют номера строк, которые увеличиваются на десятки для каждой последующей строки, затем пробел, за которым следует исходный текстовый файл. Могу ли я сделать это в vi?

Ответы [ 5 ]

2 голосов
/ 20 апреля 2010

Я не уверен насчет vi, но (поскольку вы используете тег vim) Vim позволяет вам выполнить вашу задачу следующим образом:

  1. Отрегулируйте первую строку вручную (вставьте N10 в начале строки), затем поместите курсор в начало следующей строки.

  2. Нажмите qb, чтобы начать запись макроса (b называет регистр, используемый для хранения макроса; не стесняйтесь использовать другую букву - и определенно do использует другую письмо, если у вас есть что-то полезное в b).

  3. Переместите курсор вверх к началу предыдущей строки (которую вы отрегулировали вручную). Нажмите v, чтобы запустить режим визуального выбора, затем f, чтобы переместить курсор к следующему пробелу в строке (если вы используете один пробел в качестве разделителя пробелов, то есть, отрегулируйте этот шаг, если вы используете вкладку или несколько пробелов).

  4. Нажмите y, чтобы восстановить выделенный текст. Это также удалит визуальный выбор.

  5. Переместить курсор в начало следующей строки. Нажмите P, чтобы вставить ранее выдернутый текст перед курсором, то есть в самое начало строки.

  6. Переместите курсор на числовую часть заголовка строки. Нажмите 10 C-a (1, 0, control + A), чтобы увеличить это число на 10.

  7. Переместить курсор в начало следующей строки. Нажмите q, чтобы остановить запись макроса.

  8. Нажмите 10000000 @b, чтобы выполнить макрос 10000000 раз или до тех пор, пока он не достигнет конца файла. Этого должно быть достаточно, чтобы позаботиться о всех строках в вашем файле, если только он не действительно огромен , в этом случае используйте большее число.

... или используйте Vim, чтобы написать простой сценарий для выполнения работы на любом языке, который вам больше нравится, затем запустите его из терминала (или с помощью Vim с чем-то вроде :!./your-script-name). ; -)

0 голосов
/ 20 апреля 2010

Вы можете легко сделать это в Vim с помощью:

:%s/^/\=line(".")*10 . " "/

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

Я не рассчитал время, но подозреваю, что он заметно быстрее других решений Vim.

0 голосов
/ 20 апреля 2010

Следующая команда добавит 'N <<i> номер строки * 10 >' к каждой строке.

:g/^/exe 'normal! 0iN' . (line('.')*10) . ' '
0 голосов
/ 20 апреля 2010

Обманывая ответ:

:%!awk '{print "N" NR "0", $0}'
0 голосов
/ 20 апреля 2010

Существует два возможных способа сделать это без использования внешних инструментов: макрос или Vim-скрипт. Первый способ, на мой взгляд, немного громоздок (и, вероятно, не так эффективен, как решение, указанное ниже).

Второй способ может быть реализован следующим образом (поместите код в .vimrc или отправьте его другим способом):

function! NumberLines(format) range
    let lfmt = (empty(a:format) ? 'N%04d' : a:format[0]) . ' %s'
    for lnum in range(a:firstline, a:lastline)
        call setline(lnum, printf(lfmt, lnum, getline(lnum)))
    endfor
endfunction

command! -range=% -nargs=? NumberLines <line1>,<line2>call NumberLines([<f-args>])

NumberLines функция перечисляет все строки файла в заданном диапазоне и добавляет каждой строке свой номер в соответствии с заданным форматом printf (по умолчанию 'N% 04d'). Чтобы упростить использование этой функции, я создаю здесь новую команду, которая принимает диапазон обрабатываемых строк (по умолчанию - весь файл) и необязательный аргумент - формат номера строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...