2016-07-28 4 views
-1

У меня есть скрипт python, который вытягивает URL-адреса из файла pastebin.com/archive, который имеет ссылки на пасты (которые имеют 8 случайных цифр после pastbin.com в URL-адресе). Мой текущий вывод - это .txt с данными ниже, я хочу, чтобы ссылки на пасты присутствовали (пример: http://pastebin.com///Y5JhyKQT), а не ссылки на другие страницы, такие как pastebin.com/tools). Это значит, что я могу установить wget, чтобы вытащить каждую отдельную пасту.Извлечение строк со специальным числом символов

Единственный способ, которым я могу это сделать, - написать сценарий bash, чтобы подсчитать количество символов в каждой строке и только содержать строки с 30 символами (это длина URL-адресов, ссылающихся на пасты).

Я понятия не имею, как я буду реализовывать что-то подобное с помощью grep или awk, возможно, используя цикл while do? Любая помощь будет оценена!

http://pastebin.com///tools 
http://pastebin.com//top.location.href 
http://pastebin.com///trends 
http://pastebin.com///Y5JhyKQT <<< I want to keep this 
http://pastebin.com//= 
http://pastebin.com///> 
+0

Вы можете сделать это легко в python, чтобы не было шума, чтобы потом проверить его с помощью wget. См. Мой ответ для python ниже. Не пишите в файл, если его длина больше. –

+1

В строке, которую вы говорите, хотите сохранить концы в 'Y5JhyKQT', и поэтому не имеет 8 случайных цифр в конце, поэтому я предполагаю, что вы имеете в виду« 8 случайных буквенно-цифровых символов ». Как тогда вы могли бы отличить это от строки, которую вы не хотите до нее, заканчивающейся «тенденциями», если она закончилась 8-символьным словом, как «trendier» вместо «трендов»? Или это просто совершенно нерелевантная красная сельдь, которую вы бросили туда, и все, что на самом деле имеет значение, - это длина линии, составляющая 30 символов? –

ответ

0
#!/usr/bin/env zsh 
while read aline 
do 
    if [[ ${#aline} == 30 ]]; then                                       
     #do something 
    fi 
done 

Это отражено в bash man pages в разделе "Параметры расширения".

EDIT = это решение ЗШ только

+2

Не делайте этого. См. [Why-is-use-a-shell-loop-to-process-text -emed-bad-practice] (http://unix.stackexchange.com/questions/169716/why-is-using-a-shell -loop-процесс-текст рассмотренной-плохая практика). –

+0

кричит, я думаю, я слишком долго использовал zsh –

+0

Это все равно будет неправильный подход в zsh с (почти?) Всеми теми же проблемами. Оболочка - это среда, из которой вызывать инструменты с языком для последовательного вызова, это не инструмент для манипулирования текстом. –

0

Это алгоритм

  • Найти все символы между символами новой строки или read one line at a time.
  • Подсчитайте их или store them in variable and get its count. Это длина вашей линии. Обработайте только те линии, которые точно такие же, как вы хотите. В python есть как количество символов символов, так и строка считывания.
1

Из образца вы публикуемую это выглядит как все, что вам нужно:

grep -E '/[[:alnum:]]{8}$' file 

или, может быть:

grep -E '^.{30}$' file 

Если это не работает для вас, объясните, почему и обеспечить лучший образец.

+0

Почему не 'awk 'length() == 30''?Это будет работать без регулярного выражения, и это довольно чисто, не так ли? – hek2mgl

+0

idk, если вызов функции будет быстрее, чем это сравнение regexp, плюс awk должен делать разбиение поля на каждой строке, поэтому я на 99% уверен, что grep будет более эффективным, а также быть более быстрым. nbd в любом случае. Я начал думать, что ключом к этому было то, что последние 8 символов были буквенно-цифровыми, поэтому меня вызывали по пути grep/regexp. –

+1

Похоже, вы правы. Разделение на поля - лишние накладные расходы. Спасибо за ответ! – hek2mgl

Смежные вопросы