С awk
можно постараться не читать огромную сумму текста сразу:
awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt
Успех может зависеть от используемого awk
реализация. Например, gawk
хорошо работает, но mawk
катастрофические отказы.
Это сделает задание:
perl -pe 'BEGIN { $/ = "//" } s!(?=http://\z)!\n!' urls.txt
Путем установки $/, я изменил определение строки, таким образом, это заканчивается //
вместо новой строки. Это заставляет Perl считать один URL за один раз. Маловероятно, что URL содержит //
кроме после схемы, но хорошо, если Вы сделаете, то regex помешает ему добавлять побочные новые строки.
Если Вы не хотите добавлять пустую строку перед первым URL:
perl -pe 'BEGIN { $/ = "//"; print scalar <> } s!(?=http://\z)!\n!' urls.txt
Вы могли бы попытаться сравнить, чтобы видеть ли s!http://\z!\nhttp://!
быстрее. Они эквивалентны. Обратите внимание что /g
флаг не необходим на замене, потому что может только быть одно соответствие на "строку".
$/
, это будет только иметь дело с одним URL за один раз.
– cjm
15.04.2012, 19:16
man perlvar
, но это имеет смысл тот путь.
– Alexios
15.04.2012, 20:26
http:
часть в regex. Это исследует каждый //
, но это не добавит новую строку, если это не найдет http://
.
– cjm
21.04.2012, 02:02
:
с новой строкой, чтобы нарубить файл.http
в конце строки сhttp:
и добавьте следующую строку к немуЭти шаги похожи:
tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
Проверьте, существуют ли строки, которые не запускаются с http://
, распечатайте номера строки. Это только произошло бы если a: находится где-нибудь в URL кроме после http
.
grep -nv '^http://'