テキストを解析する単純なスクリプトですが、何が間違っているのでしょうか?

テキストを解析する単純なスクリプトですが、何が間違っているのでしょうか?

私は大のユーザーです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

識別クラスや ID がないため、 を通じてページを取得しcurl、 にパイプしてgrep必要な行 ("63 個のランダムな印刷可能な ASCII 文字:") を取得し、 を使用してsedパスワードまでのすべてとそれ以降のすべてを削除し、最後に を使用してクリップボードにコピーしますpbcopy

1 つの小さな詳細を除いて、すべて正常に動作します。最終的に取得する文字列は常に 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 文字の a は実際にはソース内のエンティティとして表され&lt;、文字列が少し長くなります。

答え3

ここで考慮すべきことがあります。スクリプトの結果の文字列には、sed 操作で適切にエスケープされていない特定の文字が含まれることがよくあります。

たとえば、括弧、一重引用符と二重引用符、中括弧、感嘆符、スラッシュとバックスラッシュ、アスタリスクなどの文字が疑わしい場合があります。

一連のテストで返された文字列からこれらの文字の 1 つを削除し、結果を比較して、これらの文字の任意の数の 1 つを削除するとカウントが 63 になるかどうかを確認します。

答え4

mousio へのコメントに基づいて、grep/sed のチェーンを 1 つのコマンドに減らすことができます。

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}'

関連情報