Awk 开始块中的十六进制字符
我可以在进程块中打印十六进制字符Awk 开始块中的十六进制字符,awk,printf,hex,posix,Awk,Printf,Hex,Posix,我可以在进程块中打印十六进制字符 $ awk '{printf "%c", $0}' <<< 0x21 ! 如何在BEGIN块中打印十六进制字符?GNUawk支持十六进制符号,但不支持。awk的POSIX标准是,它规定: 整数常量不能以0x开头或包含十六进制 数字“a”、“b”、“c”、“d”、“e”、“f”、“a”、“b”、“c”、“d”、“e”或“f” 下面是一种使用bash向POSIX awk提供常量字符串的方法: awk -v p=$'\x21' 'BEGIN {pr
$ awk '{printf "%c", $0}' <<< 0x21
!
如何在BEGIN块中打印十六进制字符?GNU
awk
支持十六进制符号,但不支持。awk
的POSIX标准是,它规定:
整数常量不能以0x开头或包含十六进制
数字“a”、“b”、“c”、“d”、“e”、“f”、“a”、“b”、“c”、“d”、“e”或“f”
下面是一种使用bash
向POSIX awk提供常量字符串的方法:
awk -v p=$'\x21' 'BEGIN {printf "%c", p}'
工具书类
-vp=string
选项允许通过命令行定义-v
变量。这在POSIX规范的“选项”下有记录awk
$'\x21'
构造允许将许多特殊字符添加到$“…”
字符串中。在这里,我们添加一个十六进制。这在bash
手册中有记录bash
- 读取字符串时,awk将识别十六进制数
当读取一个数字时,awk将无法识别十六进制数字,它将抛出
从第一个非数字开始的所有内容
因此,在第一个示例中,
$0
是一个字符串,一切正常。第二个
示例x21
被丢弃,而0
被保留。解决方法是将0x21
作为
串
同一命令(开始块)正在打印“!”对我来说,在GNU Awk 3.1.5中,你能用
Awk'BEGIN{printf“%c”,“$(0x21))}
?@A.M.D试试这个Awk-c'BEGIN{printf“%c”,0x21}
在传统模式下运行Awk
,你会发现它不起作用。Awk确实支持带字符串的十六进制表示法,看我的answer@StevenPenny我看到了你非常有趣的答案,它在GNU--posix
下对我有效。它在任何其他版本的awk
下对您有效吗?我刚刚扫描了POSIX规范,没有发现任何迹象表明十六进制支持是POSIX awk的一部分。@John1024十六进制数字似乎可以用作数字,但不能解释为字符串。与stevens的回答一样,使用+0
将十六进制转换为数字可以让printf
将其读取为33
。在awk的GNU版本中,它更好地区分字符串和数字,因此它将在正确的上下文中自动将十六进制转换为数字。它不支持十六进制,“0x21”+0将转换为33,然后将其传递给打印机。这是由--posix
完成的。您也可以这样写+“0x21”
。您也可以作为数字而不是字符串进行传递。
awk -v p=$'\x21' 'BEGIN {printf "%c", p}'
$ awk 'BEGIN {printf "%c", +"0x21"}'
!