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
    选项允许通过命令行定义
    awk
    变量。这在POSIX规范的“选项”下有记录

  • $'\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"}'
      !