Простой скрипт разбора текста, что тут не так?

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

Исходя из вашего комментария к 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}'

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

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

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

Другие вопросы по тегам