如何使用sed与正则表达式将十六进制字符转换为ASCII码
问题原因
sed的\xHH转义序列属于命令预解析阶段处理的语法,而正则捕获组的内容(\1)是在替换执行阶段才会填充的动态值。你写的\x\1在sed解析命令时,\x后没有可识别的十六进制字符,会被直接解析为普通字符x,后续再拼接捕获到的十六进制串,就会输出你看到的xED结果。
解决方案
方案1:使用Perl实现(推荐,兼容性更好)
Perl的替换支持e修饰符,可以将替换部分作为表达式执行,直接完成十六进制到ASCII的转换:
echo "aaaíaaa" | perl -pe 's/&#x([[:xdigit:]]+);/chr(hex($1))/ge'
执行后输出结果:
aaaíaaa
参数说明:
hex($1):将捕获到的十六进制串转为十进制数值chr():将十进制数值转为对应的ASCII/Unicode字符g:全局替换所有匹配项e:将替换内容作为代码执行
方案2:使用GNU sed的e修饰符
如果你必须用sed,可以借助GNU sed专属的e修饰符,将替换结果作为shell命令执行,调用printf完成转义:
echo "aaaíaaa" | sed -r 's/&#x([[:xdigit:]]+);/printf "\x\1"/ge'
执行后输出结果和方案1一致。
注意:该方案仅支持GNU sed(CentOS 7默认的sed为GNU版本),不兼容BSD sed(macOS默认版本)。
内容的提问来源于stack exchange,提问作者Faabbb
相关产品推荐
相关产品推荐

