简单的脚本解析文本,这里有什么错误?

简单的脚本解析文本,这里有什么错误?

我非常喜欢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

这一切都很好,除了一个小细节。我最终得到的字符串应该总是 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 操作中未正确转义的某些字符。

例如,这些字符可能是可疑的:括号、单引号和双引号、花括号、感叹号、正斜杠和反斜杠以及星号。

我将尝试在一系列测试中从返回的字符串中删除其中一个字符,然后比较结果以查看删除任意数量的其中一个字符是否会使计数达到 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}'

相关内容