Простой скрипт, анализирующий текст, что здесь не так?

Простой скрипт, анализирующий текст, что здесь не так?

Я большой пользователь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 символов фактически представлен как сущность &lt;в исходном коде, что делает вашу строку немного длиннее.

решение3

Вот над чем вам следует задуматься: результирующая строка вашего скрипта часто может содержать определенные символы, которые не экранируются должным образом в операциях sed.

Например, подозрительными могут быть следующие символы: квадратные скобки, одинарные и двойные кавычки, фигурные скобки, восклицательные знаки, а также прямые и обратные косые черты и звездочки.

Я бы попробовал удалить один из этих символов из возвращаемой строки в серии тестов, сравнивая результаты, чтобы увидеть, увеличит ли удаление одного из любого количества этих символов количество символов до 63.

решение4

На основании вашего комментария к mousio, вашу цепочку grep/sed... можно сократить до одной команды:

Perl обычно устанавливается по умолчанию

perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/&/g; s/&lt;/</g; s/&gt;/>/g; print; exit'

Не все sed понимают этот синтаксис

sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/&quot;/"/g; s/&apos;/'\''/g; s/&amp;/\&/g; s/&lt;/</g; s/&gt;/>/g; p;q}'

Связанный контент