Простой скрипт разбора текста, что тут не так?
Я большой пользователь https://www.grc.com/passwords.htm чтобы получить надежные пароли. Тем не менее, необходимость заходить на сайт и вручную копировать пароль каждый раз, когда быстро устареет, поэтому я решил сделать небольшой скрипт, чтобы сделать это для меня. Каждый раз, когда вы перезагружаете страницу, она представляет вам новые пароли в виде простого текста, так что это сценарий.
curl ' https://www.grc.com/passwords.htm' | grep '63 random printable ASCII characters:' | sed 's/^.*size=2>//' | sed 's/<\/font>.*$//' | pbcopy
Поскольку нет идентифицирующих классов или идентификаторов, я получаю страницу через curl
Трубить grep
чтобы получить строку, которую я хочу ("63 случайных печатных символа ASCII:"), а затем я использую sed
удалить все до пароля, а также все после него, наконец, скопировав в буфер pbcopy
,
Все это прекрасно работает, за исключением одной маленькой детали. Строка, которую я получаю в конце, всегда должна содержать 63 символа, но это не так. Обычно она колеблется между 64, 67, 70 и 73, и я понятия не имею, почему.
Кто-нибудь может пролить свет на это?
4 ответа
Как уже сказал mousio, проблема заключается в кодировании HTML некоторых специальных символов.
Perl может конвертировать их надежно и легко:
curl 'https://www.grc.com/passwords.htm' | \
grep 'ASCII characters:' \
perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
Это может быть связано с кодировкой HTML, где, например, <
в 63 символов на самом деле представляется как сущность <
в источнике, делая вашу строку немного длиннее.
Исходя из вашего комментария к mousio, ваша цепочка grep/sed... может быть уменьшена до одной команды:
Perl обычно устанавливается по умолчанию
perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/&/g; s/</</g; s/>/>/g; print; exit'
Не все sed понимают этот синтаксис
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'
Вот что вам нужно учесть - результирующая строка вашего скрипта может часто содержать определенные символы, которые не экранируются должным образом в операциях sed.
Например, эти символы могут быть подозрительными: скобки, одинарные и двойные кавычки, фигурные скобки, восклицательные знаки, прямая и обратная косая черта, а также звездочки.
Я попытался бы убрать один из этих символов из возвращенной строки в серии тестов, сравнивая результаты, чтобы увидеть, приведет ли удаление одного из любого числа этих символов к 63.