У меня есть файл TSV, 8-й столбец которого является столбцом описания. Описание иногда содержит вкладки, которые я хочу экранировать как \t .

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

%s#\v([^\t]*\t){8}[^\t]*\zs\t#\\t#

Однако это оказывается слишком неэффективным.

Я хочу выбрать все после 8-го столбца с помощью /\v([ ^\t]*\t)/\v([^\t]*\t){8}\zs.* а затем выполнить простое регулярное выражение s#\t#\\t#g для этих областей.

Это должно быть возможно. Как это можно сделать?

1 ответ1

2

Сопоставьте все после 7-го столбца как одну строку (.*), Затем примените экранирование вкладки с помощью внутреннего вызова функции replacestitute substitute() , который вызывается с помощью :help sub-replace-special:

:%s#\v([^\t]*\t){8}[^\t]*\zs.*#\=substitute(submatch(0), '\t', '\\t', 'g')#

Альтернатива плагинов

Мой плагин PatternsOnText предоставляет (среди прочего) команду :[range]SubstituteInSearch/{search}/{pattern}/{string}/[flags] [count] которая упрощает это:

:%SubstituteInSearch /\v([^\t]*\t){8}[^\t]*\zs.*/\t/\\t/g

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