角色到价值的作品:
$ printf "%d\n" \'A
65
$
我有两个问题,第一个是最重要的:
- 我该如何将65变成A?
- \'A使用printf将ASCII字符转换为其值。语法是特定于printf还是在BASH中的其他地方使用?(这样的小字符串对于Google来说很难。)
角色到价值的作品:
$ printf "%d\n" \'A
65
$
我有两个问题,第一个是最重要的:
Answers:
这有效(八进制值):
$ printf '%b' '\101'
A
即使是(有些:不要超过7个)序列:
$ printf '%b' '\'{101..107}
ABCDEFG
允许(小数)个值在任何范围内的一般构造是:
$ printf '%b' $(printf '\\%03o' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
或者,您可以使用字符的十六进制值:
$ printf '%b' $(printf '\\x%x' {65..122})
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
您还可以使用xxd返回字符(使用十六进制值):
$ echo "41" | xxd -p -r
A
也就是说,一个动作与另一个动作相反:
$ printf "%x" "'A" | xxd -p -r
A
并且还可以同时处理多个十六进制值:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r
ABCDEFGHIJ
或序列(这里使用printf来获取十六进制值):
$ printf '%x' {65..90} | xxd -r -p
ABCDEFGHIJKLMNOPQRSTUVWXYZ
甚至使用awk:
$ echo 65 | awk '{printf("%c",$1)}'
A
即使是序列:
$ seq 65 90 | awk '{printf("%c",$1)}'
ABCDEFGHIJKLMNOPQRSTUVWXYZ
对于第二个问题,似乎引号语法(\'A
)特定于printf
:
如果前导字符是单引号或双引号,则该值应是单引号或双引号后面字符的基础代码集中的数值。
来自http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html