3

У меня большой файл со строками, которые выглядят как

2 Нет маршрута к указанной транзитной сети

3 Нет маршрута к месту назначения

И я хотел бы преобразовать это для использования в языке программирования в

{2, "Нет маршрута к указанной транзитной сети"},

{3, "Нет маршрута до места назначения"},

Как бы я это сделал?

4 ответа4

8

Основное преобразование:

sed 's|^\([0-9]\)\(.*\)|{\1,"\2"}|g' file.txt > file2.txt

в vim

:%s/\([0-9] \(.*\)/{\1,"\2"}/g

Это будет охватывать строки, начинающиеся с формата,

N text on the line...

Где N - однозначное число.
Может быть расширен для других форм.

4

В вашем случае достаточно простого регулярного выражения (и лучшее решение). Однако в некоторых других случаях запись макроса может быть лучше.

Простой пример макроса приведен в документации по vim, раздел 12.1, и дальнейшее описание по адресу :help q

В двух словах:

  1. Введите q за которым следует буква (буква - это register в который будет записан макрос).
  2. Выполните несколько команд, измените текст по мере необходимости, используйте всю мощь Vim.
  3. Переместите курсор на следующую строку.
  4. Нажмите q чтобы остановить запись.

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

Итак, в вашем случае, чтобы преобразовать строки следующим образом:

2 No route to specified transit network
{2, "No route to specified transit network"},
  1. Наведите курсор на одну из линий.
  2. Нажмите qa (выбор регистра a был произвольным).
  3. Нажмите именно это (включая кавычки и пробелы) I{<esc>f cl, "<esc>A"},<esc>j
  4. Нажмите q чтобы остановить запись.
  5. Нажмите 100@a и будьте счастливы, когда смотрите макрос :-)

Я оставлю читателю объяснение каждой команды из шага 3. ;-)

Конечно, это не единственное решение. Вы могли бы сделать шаг 3 разными способами.

1

Эта команда vim делает то, что вы хотите?

%s/^\(.\)\ \(.*\)$/{\1,\ "\2"},/g
1
:%s/^\s*\(\d\+\)\s\+\(\S.\{-}\)\s*$/{\1, "\2"}/

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .