Подтвердить что ты не робот

Целочисленное значение ASCII для символа в BASH с использованием printf

Работа символа:

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

У меня есть два вопроса, первый из них наиболее важен:

  • Как взять 65 и превратить его в A?
  • \'A преобразует символ ASCII в его значение с помощью printf. Является ли синтаксис специфичным для printf или используется где-либо еще в BASH? (Такие маленькие строки трудно использовать для Google.)
4b9b3361

Ответ 1

Одна строка

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

Две строки

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

Вот один, если вы не возражаете использовать awk

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

Ответ 2

Это работает (со значением в восьмеричном):

$ 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

Ответ 3

Для такого преобразования я использую perl:

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

Ответ 4

Один из вариантов заключается в прямом вводе интересующего вас символа с использованием шестнадцатеричной или восьмеричной нотации:

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

Ответ 5

Для вашего второго вопроса кажется, что синтаксис прокси-предложения (\'A) специфичен для printf:

Если ведущим символом является одиночная кавычка или двойная кавычка, значение должно быть числовым значением в базовом кодовом наборе символа после однокамерной или двойной кавычки.

От http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html

Ответ 6

Если вы хотите сохранить значение ASCII символа: (Я сделал это в BASH, и он сработал)

{
char="A"

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

echo $testing}

Выход: 65

Ответ 7

Если вы преобразуете 65 в шестнадцатеричное значение 0x41:

$ echo -e "\x41" A

Ответ 8

Здесь еще один способ преобразования 65 в (через восьмеричный):

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

Ответ 9

Для заглавных букв:

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

Выход:

C