![Простой скрипт, анализирующий текст, что здесь не так?](https://rvso.com/image/1344712/%D0%9F%D1%80%D0%BE%D1%81%D1%82%D0%BE%D0%B9%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%2C%20%D0%B0%D0%BD%D0%B0%D0%BB%D0%B8%D0%B7%D0%B8%D1%80%D1%83%D1%8E%D1%89%D0%B8%D0%B9%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%2C%20%D1%87%D1%82%D0%BE%20%D0%B7%D0%B4%D0%B5%D1%81%D1%8C%20%D0%BD%D0%B5%20%D1%82%D0%B0%D0%BA%3F.png)
Я большой пользователь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, и я понятия не имею, почему.
Может ли кто-нибудь пролить свет на этот вопрос?
решение1
Какмусиокак уже было сказано, проблема заключается в HTML-кодировке некоторых специальных символов.
Perl может преобразовать их надежно и легко:
curl 'https://www.grc.com/passwords.htm' | \
grep 'ASCII characters:' \
perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
решение2
Это может быть связано с кодировкой HTML, где, например, один <
из 63 символов фактически представлен как сущность <
в исходном коде, что делает вашу строку немного длиннее.
решение3
Вот над чем вам следует задуматься: результирующая строка вашего скрипта часто может содержать определенные символы, которые не экранируются должным образом в операциях sed.
Например, подозрительными могут быть следующие символы: квадратные скобки, одинарные и двойные кавычки, фигурные скобки, восклицательные знаки, а также прямые и обратные косые черты и звездочки.
Я бы попробовал удалить один из этих символов из возвращаемой строки в серии тестов, сравнивая результаты, чтобы увидеть, увеличит ли удаление одного из любого количества этих символов количество символов до 63.
решение4
На основании вашего комментария к 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}'