Script simples analisando texto, o que está errado aqui?

0

Sou um grande usuário do link para obter senhas strongs. No entanto, ter que ir ao site e copiar manualmente a senha toda vez que ela fica velha rapidamente, então eu decidi fazer um pequeno script para fazer isso por mim. Toda vez que você recarrega a página, ela apresenta novas senhas em texto simples, então este é o script.

curl 'https://www.grc.com/passwords.htm' | grep '63 random printable ASCII characters:' | sed 's/^.*size=2>//' | sed 's/<\/font>.*$//' | pbcopy

Como não há classes ou IDs identificadoras, recebo a página por curl , canalizo para grep para obter a linha desejada ("63 caracteres ASCII imprimíveis aleatoriamente:") e, em seguida, uso sed para apagar tudo até a senha, assim como tudo depois dela, copiando finalmente para a área de transferência com pbcopy .

Tudo isso funciona bem, exceto por um pequeno detalhe. A string que recebo no final deve ter sempre 63 caracteres, mas não é. Geralmente varia entre 64, 67, 70 e 73 e não tenho ideia do porquê.

Alguém pode lançar alguma luz sobre isso?

    
por user137369 29.12.2012 / 19:31

4 respostas

1

Como o mousio já disse, o problema é a codificação HTML de alguns caracteres especiais.

Perl pode convertê-los de maneira confiável e fácil:

curl 'https://www.grc.com/passwords.htm' | \
    grep 'ASCII characters:' \
    perl -MHTML::Entities -ne 's/.*2>|<.*//g; print decode_entities($_)'
    
por 29.12.2012 / 21:29
2

Pode ter a ver com codificação HTML, onde, por exemplo, um < nos 63 caracteres é representado como a entidade &lt; na origem, tornando sua string um pouco mais longa.

    
por 29.12.2012 / 20:10
0

Aqui está algo para você considerar - a string resultante do seu script pode conter alguns caracteres que não estão escapando adequadamente nas operações do sed.

Por exemplo, esses caracteres podem ser suspeitos: colchetes, aspas simples e duplas, colchetes curley, pontos de exclamação e barras invertidas e asteriscos.

Eu tentaria retirar um desses caracteres da string retornada em uma série de testes, comparando os resultados para ver se a remoção de qualquer um desses números levaria a contagem para 63.

    
por 29.12.2012 / 20:53
0

Baseado no seu comentário para mousio, sua cadeia de grep / sed ... pode ser reduzida a um comando:

Perl geralmente é instalado por padrão

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'

Nem todos os seds entendem essa sintaxe

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}'
    
por 29.12.2012 / 22:03