Linux sed解码html编码。需要解释一下吗

Linux sed解码html编码。需要解释一下吗,linux,web,sed,character,decoding,Linux,Web,Sed,Character,Decoding,以下sed表达式解码HTML URL编码(完全按照要求): sed's/%/\x/g' HTML编码参考可在此处找到: 然而,我不知道它是如何工作的。正则表达式似乎说:在字符串中找到“%”并用“\x”替换它,但它的作用远不止于此。为什么它在这里做解码 Example: $ echo "This%20%2C%20character%20is%20comma" | echo -e "$(sed 's/%/\\x/g')" This , character is comma sed正在将每个%更改

以下sed表达式解码HTML URL编码(完全按照要求): sed's/%/\x/g' HTML编码参考可在此处找到:

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

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

sed正在将每个
%
更改为
\x
,因此
sed的/%/\\x/g'
%2C
更改为
\x2C
,然后
echo-e“\x2C”
将十六进制转义序列解码为文本
,以便打印

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

FWIW使用GNU awk,您可以执行以下操作:

echo "This%20%2C%20character%20is%20comma" |
awk -niord '{
    head = ""
    tail = $0
    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版本更长,但如果您想更多地使用字符串,则更容易增强。

谢谢您的帮助和分享想法。