sed 解码 html 编码。需要解释如何

sed decodes html encoding. Need explanation how

以下 sed 表达式解码 HTML URL 编码(完全按照要求): sed 's/%/\x/g' HTML 编码参考可以在这里找到: http://www.w3schools.com/tags/ref_urlencode.asp

但是,我不明白它是如何工作的。正则表达式似乎在说:在字符串中找到“%”并将其替换为“\x”,但它所做的远不止于此。为什么要在这里解码?

Example:
$ echo "This%20%2C%20character%20is%20comma" | echo -e "$(sed 's/%/\x/g')"
This , character is comma
例如,

sed 每隔 % 更改为 \x,因此 sed 's/%/\x/g'%2C 更改为 \x2C,然后 echo -e "\x2C" 解码将十六进制转义序列转换为文字 , 以进行打印。

当您想将文字 % 字符打印为字符串的一部分时,该方法将失败。您可以使用 sed -r 's/%([[:xdigit:]]{2})/\x/g' 使其更加健壮,但在少数情况下可能不值得增加复杂性,因为它会阻止错误匹配的发生。

FWIW 使用 GNU awk 可以做到:

echo "This%20%2C%20character%20is%20comma" |
awk -niord '{
    head = ""
    tail = [=10=]
    while ( match(tail,/%(..)(.*)/,a) ) {
        head = head substr(tail,1,RSTART-1) chr("0x"a[1])
        tail = a[2]
    }
    print head tail
}'
This , character is comma

比 sed+echo 版本更长,但如果您想对字符串进行更多操作,则更容易增强。