У меня есть очень длинный ряд URL-адресов без разделительных символов, в том же формате, что и ниже:
http://example.comhttp://example.nethttp://example.orghttp://etc...
Я хочу, чтобы каждый URL был в новой строке. Я попытался сделать это, заменив все экземпляры "http: //" на "\ nhttp: //", используя sed
sed 's_http://_\nhttp://_g' urls.txt
но происходит ошибка сегментации (нарушение памяти). Я могу только предположить, что размер файла (более 100 ГБ) приводит к тому, что sed превышает некоторый предел.
Я мог бы разделить файл на несколько файлов меньшего размера для обработки, но все экземпляры "http: //" должны были бы быть сохранены.
Есть лучший способ это сделать?
text-processing
sed
С Сойер
источник
источник
Ответы:
С помощью
awk
вы можете избежать чтения огромного количества текста сразу:Успех может зависеть от используемой
awk
реализации. Напримерgawk
работает нормально, ноmawk
вылетает.источник
Это сделает работу:
Установив $ / , я изменил определение строки, чтобы она заканчивалась
//
вместо новой строки. Это заставляет Perl читать по одному URL за раз. Маловероятно, что URL-адрес содержит,//
кроме как после схемы, но если все-таки все в порядке, регулярное выражение будет препятствовать добавлению ложных новых строк.Если вы хотите не добавлять пустую строку перед первым URL:
Вы можете попробовать сравнительный анализ, чтобы увидеть,
s!http://\z!\nhttp://!
быстрее ли . Они эквивалентны. Обратите внимание, что этот/g
флаг не требуется при замене, поскольку в каждой строке может быть только одно совпадение.источник
$/
, он будет работать только с одним URL за раз.man perlvar
, но это имеет смысл.http:
роль в регулярном выражении. Он будет проверять каждый//
, но не будет добавлять новую строку, пока не найдетhttp://
.:
с новой строки, чтобы измельчить файл.http
в конце строки сhttp:
и добавление к ней следующей строкиЭти шаги выглядят так:
Проверьте, есть ли строки, которые не начинаются с
http://
, напечатайте номера строк. Это может произойти, только если a: находится где-то в URL-адресе, кроме послеhttp
.grep -nv '^http://'
источник