Характер к значению работает:
$ printf "%d\n" \'A
65
$
У меня два вопроса, первый из них самый важный:
- Как мне взять 65 и превратить его в А?
- \ 'A преобразует символ ASCII в его значение с помощью printf. Является ли синтаксис специфичным для printf или он используется где-нибудь еще в BASH? (Такие маленькие строки трудно найти в Google.)
Ответы:
Одна линия
printf "\x$(printf %x 65)"
Две строки
set $(printf %x 65) printf "\x$1"
Вот один, если вы не против использовать
awk
awk 'BEGIN{printf "%c", 65}'
источник
printf "$(printf '\\x%02x' $char)"
Это работает (со значением в восьмеричном формате):
$ 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
источник
Что касается вашего второго вопроса, похоже, что синтаксис ведущих кавычек (
\'A
) специфичен дляprintf
:С http://pubs.opengroup.org/onlinepubs/009695399/utilities/printf.html
источник
Один из вариантов - напрямую ввести интересующий вас символ, используя шестнадцатеричную или восьмеричную нотацию:
printf "\x41\n" printf "\101\n"
источник
Для такого преобразования я использую perl:
perl -e 'printf "%c\n", 65;'
источник
Если вы хотите сохранить значение ASCII символа: (я сделал это в BASH, и это сработало)
{ char="A" testing=$( printf "%d" "'${char}" ) echo $testing}
выход: 65
источник
Если вы конвертируете
65
в шестнадцатеричный, это0x41
:$ echo -e "\x41" A
источник
$ printf "\x41"
Для заглавных букв:
i=67 letters=({A..Z}) echo "${letters[$i-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
для\'
использования (хотя бесполезные в данном случае):man bash | less -Ip "\\\'" # press <n> to go through the matches
источник
это напечатает все "печатаемые" символы вашей базовой настройки bash:
printf '%b\n' $(printf '\\%03o' {30..127}) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
источник
Вот решение без Eval , ни $ () , ни ``:
ord () { local s printf -v s '\\%03o' $1 printf "$s" } ord 65
источник