此命令按预期工作
$ awk 'BEGIN {print "\x41"}'
A
Run Code Online (Sandbox Code Playgroud)
像这样
$ printf '\x41' | awk '{print}'
A
Run Code Online (Sandbox Code Playgroud)
但是,当您依靠 awk 识别十六进制字符时,它会失败
$ echo '\x41' | awk '{print}'
\x41
Run Code Online (Sandbox Code Playgroud)
如何克服?
您需要执行以下操作:
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))]}'
Run Code Online (Sandbox Code Playgroud)
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))}'
Run Code Online (Sandbox Code Playgroud)
gawk还有一个strtonum()功能:
printf '%s\n' '\x41' | gawk -n '{printf "%c\n", strtonum("0x" substr($0,3))}'
Run Code Online (Sandbox Code Playgroud)