Bash Can printf";%x\n“\';可以在awk中执行吗?
所有可打印字符的十六进制代码值都可以在bash中以这种方式显示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
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