Bash Can printf";%x\n“\';可以在awk中执行吗?

Bash Can printf";%x\n“\';可以在awk中执行吗?,bash,awk,Bash,Awk,所有可打印字符的十六进制代码值都可以在bash中以这种方式显示 printf "%x\n" \'a 61 awk 'BEGIN{printf("%x\n",\\'a)}' awk 'BEGIN{printf("%x\n",\'a)}' 所有这些都不能在awk中执行,在awk中没有办法执行吗? awk不提供这种printf格式,比如bash awk -v var="a" 'BEGIN{printf("%x\n", var)}' 0 echo -n a|xxd 0000000: 61

所有可打印字符的十六进制代码值都可以在bash中以这种方式显示

printf "%x\n"  \'a
61

awk 'BEGIN{printf("%x\n",\\'a)}'
awk 'BEGIN{printf("%x\n",\'a)}'
所有这些都不能在awk中执行,在awk中没有办法执行吗?
awk不提供这种printf格式,比如bash

awk -v var="a"  'BEGIN{printf("%x\n", var)}'
0
echo -n  a|xxd
0000000: 61   
使用echo-na | xxd获取a可打印字符的十六进制代码值很简单,我的问题是awk是否提供了这种打印格式,比如在bash中,而不是如何在awk中使用其他方法获取十六进制代码值

awk -v var="a"  'BEGIN{printf("%x\n", \'var)}'
bash: syntax error near unexpected token `)'
debian8@debian:~$ awk -v var="a"  "BEGIN{printf("%x\n", \'var)}"
awk: cmd. line:1: BEGIN{printf(%xn, \'var)}
awk: cmd. line:1:              ^ syntax error
awk: cmd. line:1: BEGIN{printf(%xn, \'var)}
awk: cmd. line:1:                   ^ backslash not last character on line
awk: cmd. line:1: BEGIN{printf(%xn, \'var)}
awk: cmd. line:1:                   ^ syntax error
结论:awk不支持这种printf格式

如果需要字符的十六进制代码值:

如果需要字符的十六进制代码值:


wrt您的第一次尝试产生语法错误-您不能在从shell调用的任何
分隔的脚本中包含
'
。任何逃跑的尝试都不允许你这么做。请记住您的第二次尝试-一个
”分隔的脚本可以包含
,但它们需要转义。上面报告了这两个语法错误,与试图从awk或其他任何东西打印十六进制无关,甚至与awk无关——这些是使用引号分隔脚本调用任何工具时都会遇到的shell语法错误

现在-这就是你想要做的吗

$ awk -v var='a' -l ordchr 'BEGIN{printf "%x\n", ord(var)}'
61

上面使用GNU awk作为
ord()
函数。

wrt您的第一次尝试产生语法错误-您不能在任何从shell调用的
分隔脚本中包含
'
。任何逃跑的尝试都不允许你这么做。请记住您的第二次尝试-一个
”分隔的脚本可以包含
,但它们需要转义。上面报告了这两个语法错误,与试图从awk或其他任何东西打印十六进制无关,甚至与awk无关——这些是使用引号分隔脚本调用任何工具时都会遇到的shell语法错误

现在-这就是你想要做的吗

$ awk -v var='a' -l ordchr 'BEGIN{printf "%x\n", ord(var)}'
61

上面使用GNU awk作为
ord()
函数。

这里有一个命令显示
awk
printf
函数确实不支持
前缀语法来获取字符的代码点(适用于GNU awk、Mawk和BSD/macOS awk):

请注意,Bash v4+的
printf
内置是Unicode感知的

$ printf '%x\n' \'€
20ac  # U+20AC is the Unicode code point of the EURO symbol
诸如
xxd
之类的十六进制转储实用程序只会为您提供字符的字节表示形式
,它与7位ASCII范围内的代码点相同
在基于UTF-8的区域设置中(这是当今的典型情况),任何超出ASCII范围的内容都将打印组成字符UTF-8编码形式的字节:

$ xxd <<<€
00000000: e282 ac0a # 0xe2 0x82 0xac are the UTF-8 encoding of Unicode char. U+20AC

    这里有一个命令显示
    awk
    printf
    函数确实不支持
    前缀语法来获取字符的代码点(适用于GNU awk、Mawk和BSD/macOS awk):

    请注意,Bash v4+的
    printf
    内置是Unicode感知的

    $ printf '%x\n' \'€
    20ac  # U+20AC is the Unicode code point of the EURO symbol
    
    诸如
    xxd
    之类的十六进制转储实用程序只会为您提供字符的字节表示形式
    ,它与7位ASCII范围内的代码点相同
    在基于UTF-8的区域设置中(这是当今的典型情况),任何超出ASCII范围的内容都将打印组成字符UTF-8编码形式的字节:

    $ xxd <<<€
    00000000: e282 ac0a # 0xe2 0x82 0xac are the UTF-8 encoding of Unicode char. U+20AC
    
参见
$ gawk -v char=€ 'BEGIN{ for(n=0;n<=0xffff;n++) ord[sprintf("%c",n)]=n; printf "%x\n", ord[char]}'
20ac