![簡單的腳本解析文本,這裡有什麼問題嗎?](https://rvso.com/image/1344712/%E7%B0%A1%E5%96%AE%E7%9A%84%E8%85%B3%E6%9C%AC%E8%A7%A3%E6%9E%90%E6%96%87%E6%9C%AC%EF%BC%8C%E9%80%99%E8%A3%A1%E6%9C%89%E4%BB%80%E9%BA%BC%E5%95%8F%E9%A1%8C%E5%97%8E%EF%BC%9F.png)
我是一個大用戶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 實際上表示為<
來源中的實體,使您的字串更長一些。
答案3
您需要考慮以下事項 - 腳本的結果字串可能通常包含某些在 sed 操作中未正確轉義的字元。
例如,這些字元可能是可疑的:方括號、單引號和雙引號、大括號、感嘆號、正斜線和反斜線以及星號。
我會嘗試在一系列測試中從返回的字串中刪除其中一個字符,比較結果以查看刪除任意數量的這些字符中的一個是否會使計數達到 63。
答案4
根據您對 mousio 的評論,您的 grep/sed... 鏈可以簡化為一個命令:
Perl 通常是預設安裝的
perl -ne 'next unless /63 random printable ASCII characters:/; s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/&/g; s/</</g; s/>/>/g; print; exit'
並非所有 sed 都理解這個語法
sed -n '/63 random printable ASCII characters:/{s/^.*size=2>//; s/<\/font>.*$//; s/"/"/g; s/'/'\''/g; s/&/\&/g; s/</</g; s/>/>/g; p;q}'