使用printf将整数ASCII值赋给BASH中的字符
价值作品的特点:
$ printf "%d\n" \'A 65 $
我有两个问题,第一个是最重要的:
- 我如何拿65并把它变成A?
- \ A使用printf将ASCII字符转换为其值。 特定于printf的语法,还是在BASH的其他地方使用? (这样的小string很难Google。)
一条线
printf "\x$(printf %x 65)"
两行
set $(printf %x 65) printf "\x$1"
这里是一个如果你不介意使用awk
awk 'BEGIN{printf "%c", 65}'
这工作(以八进制值):
$ printf '%b' '\101' A
即使(有些人:不要超过7)序列:
$ printf '%b' '\'{101..107} ABCDEFG
允许(十进制)值在任何范围内的一般结构是:
$ printf '%b' $(printf '\\%03o' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
或者你可以使用字符的hex值:
$ printf '%b' $(printf '\\x%x' {65..122}) ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
你也可以用xxd(使用hex值)取回字符:
$ echo "41" | xxd -p -r A
也就是说,一个动作与另一个动作是相反的:
$ printf "%x" "'A" | xxd -p -r A
也可以同时使用几个hex值:
$ echo "41 42 43 44 45 46 47 48 49 4a" | xxd -p -r ABCDEFGHIJ
或序列(printf在这里用来获取hex值):
$ printf '%x' {65..90} | xxd -r -p ABCDEFGHIJKLMNOPQRSTUVWXYZ
甚至使用awk:
$ echo 65 | awk '{printf("%c",$1)}' A
即使对于序列:
$ seq 65 90 | awk '{printf("%c",$1)}' ABCDEFGHIJKLMNOPQRSTUVWXYZ
对于这种转换,我使用Perl:
perl -e 'printf "%c\n", 65;'
对于第二个问题,似乎前导语法( \'A
)特定于printf
:
如果前导字符是单引号或双引号,则该值应为单引号或双引号后面字符的基础代码集中的数字值。
从http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
一种select是使用hex或八进制表示法直接input您感兴趣的字符:
printf "\x41\n" printf "\101\n"
如果你想保存字符的ASCII值:(我在BASH中这样做,它的工作)
{ char="A" testing=$( printf "%d" "'${char}" ) echo $testing}
输出:65
这是将65转换为A(通过八进制)的另一种方法:
help printf # in Bash man bash | less -Ip '^[[:blank:]]*printf' printf "%d\n" '"A' printf "%d\n" "'A" printf '%b\n' "$(printf '\%03o' 65)"
在man bash
search\'
使用(尽pipe在这种情况下是徒劳的):
man bash | less -Ip "\\\'" # press <n> to go through the matches
如果您将65
转换为hex, 0x41
:
$ echo -e "\x41" A