Если ваш префикс везде фиксирован (вы предлагали использовать шаблон, начинающийся с /<prefix>\s\+...
), то вы, вероятно, можете использовать что-то простое:
:g/^<prefix>\s/s/,\s\+/;\r<prefix> /g
Другими словами, для каждой строки, начинающейся с <prefix>
, замените все запятые (с последующим пробелом) на точку с запятой, возврат каретки и фиксированный <prefix>
с последующим пробелом.
Но если предположить, что ваш <prefix>
является более сложным и переменным и Вы хотите записать его в регулярное выражение:
Один из способов добиться этого с помощью команды :substitute
- это использовать дополнительный вызов функции substitute()
как часть замены, который можно использовать для замены произвольного числа запятых.
Один из возможных подходов:
:s/\(\S\+\)\s\+[^,]*\zs\(,\s*[^,]*\)*\ze;$/\=substitute(submatch(0),',\s*',";\r".submatch(1)." ",'g')/
Разбивка шаблона:
\(\S\+\)
: Сопоставьте префикс в группе захвата. (Вы можете использовать что-то лучшее, более конкретное c, чем просто непробелы, чтобы правильно сопоставлять только те строки, которые вам нужны.) \s\+
: пропустить пробел. [^,]*
: Пропустить первый токен. \zs
: отметить начало матча. Подстановка заменяет только эту часть. \(,\s*[^,]*\)*
: последовательность из одного или нескольких токенов с запятой и необязательный пробел. \ze
: отметка конца матча. ;$
: сопоставить точку с запятой в конце всего этого.
На этом этапе стратегия снова заключается в замене запятых точкой с запятой, возвратом каретки и префиксом, но делать это динамически.
Это достигается путем использования этих при замене:
\=
: использовать выражение в замене (см. :help sub-replace-expression
.) substitute(submatch(0),',\s*',";\r".submatch(1)." ",'g')
: заменить запятые (и необязательные пробелы после них) на точку с запятой, возврат каретки и префикс, а затем пробел. submatch(0)
: мы выполнение такой замены на матче (часть между \zs
и \ze
только.) ";\r"
: начало замены, точка с запятой и возврат каретки. .
: Оператор точки объединяет строки в Vimscript. submatch(1)
: Относится вернуться к группе 1, которую мы использовали в этом случае для захвата префикса. 'g'
: заменить все совпадения.
Это довольно сложная замена, но имеет преимущество позаботится о замене в одной команде :s
, что упрощает использование его в диапазоне или последующее повторение без необходимости записи макроса.
Техника использования * 1082 Функция * в замене :s
также полезна для обработки случаев, когда групп захвата недостаточно, например, представленной вами.