该命令按预期工作
$ awk 'BEGIN {print "\x41"}'
A
正如这个
$ printf '\x41' | awk '{print}'
A
但是,当您依赖 awk 识别十六进制字符时,它会失败
$ echo '\x41' | awk '{print}'
\x41
如何克服这个问题?
答案1
你需要做类似的事情:
printf '%s\n' '\x41' |
awk 'BEGIN{for (i=0;i<0x100;i++) x[sprintf("%02x",i)]=sprintf("%c",i)}
{print x[tolower(substr($0,3))]}'
awk
无法将十六进制字符串直接转换为数字,更不用说字符了。
这种事情在 中做起来要容易得多perl
。看这里awk
的实施urldecode
。
作为@terdon 暗示,GNU 实现awk
有一个-n|--non-decimal-data
选项,允许awk
识别输入的十六进制和八进制数字。所以你也可以这样做:
printf '%s\n' '\x41' | gawk -n '{printf "%c\n", +("0x" substr($0,3))}'
gawk
还有一个strtonum()
功能:
printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'