如何使用 sed 和正则表达式将十六进制字符转换为 ASCII

How to convert Hex characters to ASCII using sed & regex

我有一个文件,其中有几个用十六进制编码的特殊字符(其他单词是可读的)。 我想使用 sed 使用 \xHH 来转换它们,但我无法使用正则表达式来匹配要翻译的六进制值。

如果我手动强制使用 Hexa 值,它会起作用:

[user@Centos7]$ echo "aaaíaaa" | sed -r 's/&#x([[:xdigit:]]+);/\xED/g'
aaaíaaa

但是如果我尝试重新使用我的正则表达式中的匹配项以使用 \xHH 将其转换为 ACSII 值,它会失败 => 结果是 \x + 匹配的值

[user@Centos7]$ echo "aaaíaaa" | sed -r 's/&#x([[:xdigit:]]+);/\x/g'
aaaxEDaaa

有什么线索可以帮助我解决这个问题吗? 谢谢

您可以通过 perl 使用 MHTML::Entities:

实现
echo 'aaaíaaa' | perl -MHTML::Entities -CS -pe '$_ = decode_entities($_)'

参见online demo

这里,

  • 由于 -CSPerl 允许在 STDOUT 中使用 UTF-8 字符
  • decode_entities($string) 例程用相应的 Unicode 字符替换 HTML 在 $string 中找到的实体(n 个可识别的实体保持原样)。