Как распечатать символ ASCII с помощью разных кодовых точек в Bash?

В таблице ASCII существует символ «J», который имеет коды в разных системах с числами:

Oct Dec Hex Char 112 74 4A J 

Можно напечатать этот символ восьмеричной точкой кода, напечатав printf '\112' или echo $'\112' . Как распечатать один и тот же символ с помощью десятичных и шестнадцатеричных презентаций с кодовыми точками?

5 Solutions collect form web for “Как распечатать символ ASCII с помощью разных кодовых точек в Bash?”

Hex:

 printf '\x4a' 

декабрь:

 printf "\\$(printf %o 74)" 

Альтернатива для hex 🙂

 xxd -r <<<'0 4a' 

С zsh :

 $ printf '\x4a\n' # Hex J $ printf "\\$(([##8]74))\n" # Dec J 

Чтобы получить символ (в текущей кодировке) из кодовой точки Юникода:

 $ printf '\U1F42E\n' # Hex 🐮 $ printf "\\U$(([##16]128046))\n" # Dec 🐮 

В общем случае оболочка может понимать шестнадцатеричные, октенциальные и десятичные числа в переменных, если они определены как integers :

 $ declare -i v1 v2 v3 v4 v5 v6 v7 $ v1=0112 $ v2=74 $ v3=0x4a $ v4=8#112 $ v5=10#74 $ v6=16#4a $ v7=18#gg echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7" 74 74 74 74 74 74 304 

Или они являются результатом «Арифметического расширения»:

 $ : $(( v1=0112, v2=74, v3=0x4a, v4=8#112, v5=10#74, v6=16#4a, v7=18#gg )) $ echo "$v1 $v2 $v3 $v4 $v5 $v6 $v7" 74 74 74 74 74 74 304 

Таким образом, вам просто нужен один способ печати символа, который принадлежит переменной.
Но вот два возможных способа:

 $ var=$((0x65)) $ printf '%b\n' "\\$(printf '0%o' "$var")" e $ declare -i var $ var=0x65; printf '%b\n' "\U$(printf '%08x' "$var")" e 

Требуется два printf, один для преобразования значения в шестнадцатеричную строку, а второй для фактического вывода символа.

Второй будет печатать любую точку UNICODE (если ваша консоль правильно установлена).
Например:

 $ var=0x2603; printf '%b\n' "\U$(printf '%08x' "$var")" ☃ 

Снежный человек.

Символ, который имеет представление utf-8 как f0 9f 90 ae равен 0x1F42E . Найдите cow face site:fileformat.info чтобы получить его :

 $ var=0x1F42F; printf '%b\n' "\U$(printf '%08x' "$var")" 🐮 

Примечание . Проблема с методом UNICODE связана с тем, что для bash до 4.3 (исправлено в этой версии и выше) символы между точками UNICODE 128 и 255 (в десятичной форме) могут быть неправильно напечатаны.


Рекомендации

Четвертый абзац внутри PARAMETERS in man bash :

Если переменная имеет свой набор целочисленных атрибутов, тогда значение оценивается как арифметическое выражение, даже если расширение $ ((…)) не используется (см. Ниже Арифметическое расширение).

Внутри «АРИФМЕТИЧЕСКОЙ ОЦЕНКИ» в man bash :

Константы с ведущим 0 интерпретируются как восьмеричные числа. Ведущий 0x или 0X обозначает шестнадцатеричный. В противном случае числа принимают форму [base #] n, где необязательная база представляет собой десятичное число от 2 до 64, представляющее арифметическую базу, а n – число в этой базе. Если база # опущена, то используется база 10. Знаки больше 9 представлены строчными буквами, буквами верхнего регистра, @ и _ в этом порядке. Если основание меньше или равно 36, строчные и прописные буквы могут использоваться взаимозаменяемо, чтобы представлять числа от 10 до 35.

Десятичная дробь:

 chr() { local c for c do printf "\\$((c/64*100+c%64/8*10+c%8))" done } chr 74 

Hex:

 chr $((16#4a)) 

Функция может выполнять последовательности:

 $ chr 74 75 76; echo JKL $ 

Вы можете использовать библиотеку POSIX Awk stdlib :

 $ awklib 'BEGIN {print str_chr(74)}' J $ awklib 'BEGIN {print str_chr(+base_conv("4A", 16, 10))}' J $ awklib 'BEGIN {print str_chr(+base_conv(112, 8, 10))}' J $ awklib 'BEGIN {print str_chr(+base_conv(1001010, 2, 10))}' J 
  • Извлечение информации о трассировке с помощью gawk
  • Гауссовский, который запускается с nohup на удаленной машине Linux, убивается, когда локальный компьютер отключается до выхода оболочки
  • Как я могу запустить `watch` в качестве фоновой работы?
  • Записывать вывод программы в файл журнала, содержащий PID в его имени
  • Объедините две команды в .bash_profile
  • Инкапсуляция команды Backtick
  • Очистить или отключить псевдонимы в zsh
  • Как использовать sudo для удаления содержимого каталога
  • Сценарий оболочки с циклом for и "array"
  • Инструмент командной строки для «cat» попарно расширяет все строки в файле
  • Как я могу упростить эту команду только для использования awk?
  • Linux и Unix - лучшая ОС в мире.