BEGIN块中的十六进制字符

时间:2014-12-15 07:38:20

标签: awk printf hex posix

我可以在过程块中打印十六进制字符

$ awk '{printf "%c", $0}' <<< 0x21
!

但是,相同的字符不会在BEGIN块中打印

$ awk 'BEGIN {printf "%c", 0x21}'
0

如何在BEGIN块中打印十六进制字符?

2 个答案:

答案 0 :(得分:3)

GNU awk支持十六进制表示法,但traditional awk does notawk的POSIX标准为here,并声明:

  

整数常量不能以0x开头或包含十六进制   数字'a','b','c','d','e','f','A','B','C','D','E'或'F'。

这是一种使用bash为POSIX awk提供常量字符串的方法:

awk -v p=$'\x21' 'BEGIN {printf "%c", p}'

参考

  • -v p=string

    -v选项允许通过命令行定义awk个变量。这在“选项”here下的POSIX规范中有记录。

  • $'\x21'

    $'...'构造允许将许多特殊字符添加到bash字符串中。在这里,我们添加一个十六进制。这已记录在bash手册here

答案 1 :(得分:0)

当读取字符串时,awk将识别十六进制数字。

当读取数字时,awk无法识别十六进制数字,它将会丢失 一切都以第一个非数字开头。

所以第一个例子$0是一个字符串,一切都很好。随着第二个 示例x21被抛弃,剩下0。解决方法是将0x21作为传递 串

$ awk 'BEGIN {printf "%c", +"0x21"}'
!