Как (с хорошей асимптотической сложностью) удалить весь определенный символ из (очень длинной) строки? - PullRequest
0 голосов
/ 28 октября 2018

У меня есть строка с 25,9 миллионами символов, около 2,4 миллионов из которых являются запятыми, и я хочу удалить все запятые из строки.

Если я использую команду :s/,//g, она создает регулярное выражение, которое многократно выполняется в строке, пока не останется запятых. Кажется, это происходит за время O (n ^ 2) на основе эмпирических измерений. И поэтому мое регулярное выражение в этой строке длится более часа.

Использование макроса бесполезно из-за возникающей перерисовки, которая, как правило, стоит дорого, когда вы находитесь в середине такой длинной строки.

Разделение строк кажется наилучшим вариантом, но из-за структуры файла мне нужно создать новый буфер, чтобы сделать это чисто.

Да, есть гораздо лучшие способы вывода такого большого количества данных, которые не включают CSV с нелепым количеством столбцов, давайте предположим, что я не генерировал их, но у меня есть, и я должен с ними работать.

Существует ли асимптотически быстрый способ простого удаления каждого вхождения определенного символа из строки в vim?

1 Ответ

0 голосов
/ 29 октября 2018

Как текстовый редактор, Vim плохо подходит для таких патологически отформатированных файлов (как вы уже узнали).

Как уже отмечали другие, tr является хорошей альтернативой для удаления запятых. Либо внешне:

$ tr -d , input.txt

Или изнутри Vim:

:.! tr -d ,

Vim также имеет встроенную функцию низкого уровня :help tr(). К сожалению, это не обрабатывает удаление, только преобразование. Вы можете использовать его для преобразования запятых в точки с запятой в текущей строке следующим образом:

:call setline('.', tr(getline('.'), ',', ';'))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...