使用printf将ASCII值整数转换为BASH中的字符


84

角色到价值的作品:

$ printf "%d\n" \'A
65
$ 

我有两个问题,第一个是最重要的:

  • 我该如何将65变成A?
  • \'A使用printf将ASCII字符转换为其值。语法是特定printf还是在BASH中的其他地方使用?(这样的小字符串对于Google来说很难。)
bash  ascii  printf 

在Windows中,使用ALT + 65来打印ASCII字符-不幸的是,在Unix / bash上将无法使用;)
schnaader

2
@schnaader,但是您不能编写脚本。
ctrl-alt-delor

2
@richard:Errr ..这不容易,也不实用,但是您可以:)“仅”启动运行Windows或MS-DOS的VM,将“ echo”,ALT,6、5,> mysharedfolder \ file.txt发送为对其进行击键,并从VM共享文件夹中读取file.txt。
schnaader 2015年

2
@schnaader,你可以用酒来做吗?
Emory

Answers:


69

一条线

printf "\x$(printf %x 65)"

两行

set $(printf %x 65)
printf "\x$1"

如果您不介意使用以下方法 awk

awk 'BEGIN{printf "%c", 65}'

3
应该也可以工作printf "$(printf '\\x%02x' $char)"
0andriy

31

这有效(八进制值):

$ 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


9

一种选择是使用十六进制或八进制表示法直接输入您感兴趣的字符:

printf "\x41\n"
printf "\101\n"

8

对于这种转换,我使用perl:

perl -e 'printf "%c\n", 65;'

2
或者在perl中,打印chr(65),“ \ n”;如果要执行很多操作,虽然perl可能是一个不错的选择,但是使用shell的printf将您的数字转换为可以转为\ 0转义序列的数字就可以了。使用unicode更为复杂,因为您需要在printf中提供\ u支持。
彼得·科德斯

不幸的是,Perl是一种被遗忘的语言。Python更好,现在几乎所有Linux机器中都使用Python。另外,问题是关于Shell-Bash而不是其他平台!
s3n0

7

如果要保存字符的ASCII值:(我在BASH中这样做,并且可以正常工作)

{
char="A"

testing=$( printf "%d" "'${char}" )

echo $testing}

输出:65


这行得通,谢谢。我想从键入的字符中获取一个整数(ASCII码)。我编写了一个脚本:{read -n 1 c; echo $(printf“%d”“'$ {c}”)}
Phaedrus

4

如果转换65为十六进制,则为0x41

$ echo -e "\x41" A


如果您知道要打印ASCII字符的十六进制值$ printf "\x41"
katta

3

这是将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\'使用(虽然徒劳在这种情况下):

man bash | less -Ip "\\\'"  # press <n> to go through the matches

3

对于大写字母:

i=67
letters=({A..Z})
echo "${letters[$i-65]}"

输出:

C

1

这将打印基本bash设置的所有“可打印”字符:

printf '%b\n' $(printf '\\%03o' {30..127})

 !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.