角色转值有效:
$ printf "%d\n" \'A
65
$
我有两个问题,第一个问题最重要:
- 如何将65转换为A?
- 'A使用printf将ASCII字符转换为其值。 该语法是否特定于 printf,还是在BASH的其他地方也使用?(这样的小字符串很难在Google中搜索)
角色转值有效:
$ printf "%d\n" \'A
65
$
我有两个问题,第一个问题最重要:
一行
printf "\x$(printf %x 65)"
两行set $(printf %x 65)
printf "\x$1"
如果您不介意使用 awk
,这里有一个示例:
awk 'BEGIN{printf "%c", 65}'
printf "$(printf '\\x%02x' $char)"
。 - 0andriy这个可以正常工作(使用八进制的值):
$ 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
$ 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
的:
如果前导字符是单引号或双引号,则值应该是紧随单引号或双引号后的字符在底层代码集中的数值。
参考自https://pubs.opengroup.org/onlinepubs/9699919799/utilities/printf.html
一种选项是直接使用十六进制或八进制表示法输入您感兴趣的字符:
printf "\x41\n"
printf "\101\n"
\r
),我发现我必须使用以下内容:testchar=$'\r'; if [ ${testchar} = $'\r' ]; then echo "is true"; else echo "is false"; fi
。可以使用ASCII十六进制代替\r
,即$'\x0D'
。但是,条件语句中的字符串“\r”或其十六进制等效物均无法正常工作,始终返回false。 - Stephen Hosking对于这种转换,我使用perl:
perl -e 'printf "%c\n", 65;'
{
char="A"
testing=$( printf "%d" "'${char}" )
echo $testing}
输出: 65
65
转换成十六进制,它会变成0x41
:
$ echo -e "\x41"
A
大写字母:
i=67
letters=({A..Z})
echo "${letters[$i-65]}"
输出:
C
这里是将65转化为16进制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
这将打印出您的基本bash设置中的所有“可打印”字符:
printf '%b\n' $(printf '\\%03o' {30..127})
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~