Ответ 1
Одна строка
printf "\x$(printf %x 65)"
Две строки
set $(printf %x 65)
printf "\x$1"
Вот один, если вы не возражаете использовать awk
awk 'BEGIN{printf "%c", 65}'
Работа символа:
$ printf "%d\n" \'A
65
$
У меня есть два вопроса, первый из них наиболее важен:
Одна строка
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
Или вы можете использовать шестнадцатеричные значения символов:
$ 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
Для такого преобразования я использую perl:
perl -e 'printf "%c\n", 65;'
Один из вариантов заключается в прямом вводе интересующего вас символа с использованием шестнадцатеричной или восьмеричной нотации:
printf "\x41\n"
printf "\101\n"
Для вашего второго вопроса кажется, что синтаксис прокси-предложения (\'A
) специфичен для printf
:
Если ведущим символом является одиночная кавычка или двойная кавычка, значение должно быть числовым значением в базовом кодовом наборе символа после однокамерной или двойной кавычки.
От http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
Если вы хотите сохранить значение ASCII символа: (Я сделал это в BASH, и он сработал)
{
char="A"
testing=$( printf "%d" "'${char}" )
echo $testing}
Выход: 65
Если вы преобразуете 65
в шестнадцатеричное значение 0x41
:
$ echo -e "\x41"
A
Здесь еще один способ преобразования 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
Для заглавных букв:
i=67
letters=({A..Z})
echo "${letters[$i-65]}"
Выход:
C