Целочисленное значение ASCII в символ в BASH с использованием printf - PullRequest
69 голосов
/ 21 мая 2009

Символ к значению работает:

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

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

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

Ответы [ 8 ]

55 голосов
/ 18 ноября 2009

Одна строка

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

Две строки

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

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

awk 'BEGIN{printf "%c", 65}'
22 голосов
/ 23 сентября 2015

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

$ 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 голосов
/ 21 мая 2009

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

perl -e 'printf "%c\n", 65;'
8 голосов
/ 01 декабря 2011

По вашему второму вопросу, похоже, синтаксис лидирующей кавычки (\'A) специфичен для printf:

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

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

8 голосов
/ 21 мая 2009

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

printf "\x41\n"
printf "\101\n"
7 голосов
/ 22 февраля 2012

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

{
char="A"

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

echo $testing}

Выход: 65

4 голосов
/ 20 января 2017

Если вы конвертируете 65 в шестнадцатеричный код, это 0x41:

$ echo -e "\x41" A

3 голосов
/ 20 ноября 2014

Вот еще один способ конвертировать 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
...