Замена строками в очень большом файле

find /path/to/dir -name .htaccess -delete
10
20.08.2016, 17:37
3 ответа

С awk можно постараться не читать огромную сумму текста сразу:

awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt

Успех может зависеть от используемого awk реализация. Например, gawk хорошо работает, но mawk катастрофические отказы.

11
27.01.2020, 20:00

Это сделает задание:

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 флаг не необходим на замене, потому что может только быть одно соответствие на "строку".

6
27.01.2020, 20:00
  • 1
    , Является жемчугом regexp механизм хорошо с multi-gigabyte-long строками? –  Alexios 15.04.2012, 14:24
  • 2
    @Alexios, вероятно, не, но это не должно быть. Так как я изменился $/, это будет только иметь дело с одним URL за один раз. –  cjm 15.04.2012, 19:16
  • 3
    , я вижу то, что Вы сделали там. Это было некоторое время с 90-х, и я имел к man perlvar, но это имеет смысл тот путь. –  Alexios 15.04.2012, 20:26
  • 4
    Linux позволяет URL встраивать несколько наклонных черт в пути, таким образом, этот код может перестать работать, если у Вас есть какой-либо из тех. Тестирование на целую строку, http и все, не будет иметь этой проблемы. –  Joe 21.04.2012, 01:24
  • 5
    @Joe, я тестирую на http: часть в regex. Это исследует каждый //, но это не добавит новую строку, если это не найдет http://. –  cjm 21.04.2012, 02:02
  1. Измените все случаи a : с новой строкой, чтобы нарубить файл.
  2. Замена
    • http в конце строки с
    • новая строка, сопровождаемая http: и добавьте следующую строку к нему
  3. Повторитесь однажды, таким образом, четные и нечетные строки обновляются

Эти шаги похожи:

tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
  1. Проверьте, существуют ли строки, которые не запускаются с http://, распечатайте номера строки. Это только произошло бы если a: находится где-нибудь в URL кроме после http.

    grep -nv '^http://'

5
27.01.2020, 20:00

Теги

Похожие вопросы