Может ли замещающая команда Vim обрабатывать рекурсивный шаблон как "t labe" в sed? - PullRequest
2 голосов
/ 08 марта 2020

Просто случайный пример:

aaa 01 02 03 04 05

Число чисел за "aaa" не зафиксировано. Ожидаемый результат замены:

aaa 01
aaa 02
aaa 03
aaa 04
aaa 05

Я знаю, как сделать это с помощью "t label" sed или с помощью Vim, используя команды типа

:%s/\v%(^(\a+) .{-})@<= (\d+)/\r\1 \2/g

, но мне интересно, есть ли рекурсивный способ справиться с этим с Vim.

Ответы [ 2 ]

3 голосов
/ 08 марта 2020

Использование подстановки vim (:s)

1 Использование :s и подтверждение выполнения задания:

:%s/\s\+/\raaa /gc

Когда vim запрашивает подтверждение , вы нажимаете n, затем a.

2 Вызовите функции в команде :s vim:

%s/\v((\S+)\s+\S+)(.*)/\=submatch(1).substitute(submatch(3), '\s\+',"\r".submatch(2)."&",'g')

Вышеприведенная команда выглядит длинной, но она довольно просто.

Использование макроса vim

На вашем месте я бы сделал это с макросом в vim. Лично я чувствую, что это будет "vim" путь:

Предположим, что строка в вашем примере находится в строке1, а ваш курсор находится на первом столбце. Вы нажимаете:

qqyw2f<Space>i<Enter><Ctrl-r>"<Esc>0q

Чтобы записать макрос и сохранить его в регистре q. Затем вы можете просто воспроизвести макрос x раз, например:

99@q

и посмотреть, как vim выполняет свою работу. Общее количество нажатий клавиш до конечной sh работы будет меньше 20.

Похоже:

enter image description here

1 голос
/ 08 марта 2020

Вы можете использовать

:%s/\v(\S+)(^(\S+)\s+\S+\s.{-})@<=/\r\3 \1/g

Подробности

  • \v - режим очень волшебный c ВКЛ
  • (\S+) - Группа 1: любой один или несколько непробельных символов
  • (^(\S+)\s+\S+\s.{-})@<= -, которым предшествует (()@<= - это положительная конструкция с обратной стороны, однако она считается группой):
    • ^ - начало строки
    • (\S+) - Группа 3: любой один или несколько непробельных символов
    • \s+ - 1+ пробельных символов
    • \S+ - 1+ непробельных символов
    • \s - 1 символ пробела
    • .{-} - любые 0+ символов, кроме символов разрыва строки, как можно меньше

Результат:

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