собирался написать это как комментарий к @ 'S Coombs', но боялся, что это не поместится, и форматирование в комментариях не работает так хорошо.
Re:
for h in $(echo "4161" | sed "s/\(..\)/\1 /g"); do printf `echo "\x$h"`;done
Хорошо для ASCII, но я думаю, что стандартом для большинства дистрибутивов в наши дни является UTF-8 (и был во многих до 2011 года).Практически ничего из вышеперечисленного "не делает правильно" со входом UTF-8.Пример: используя юникод "звезда" (U + 2605), приведенный выше код выдает:
> LC_ALL=en_US.UTF-8 ## making this explicit for this example
> star="★"
> hex () {
if ((!$#)); then return; fi
for ((i=0;i<${#1};i++));do printf %02X \'${$1:$i:1};done
}
> hex "$star"
2605
Если вы хотите, чтобы фактические шестнадцатеричные байты UTF-8 составляли звезду, вам нужно установить локальпервый.Как в:
> LC_ALL=C hex "$star"
E29885
Если у вас смешанный вывод (например, латинская строчная буква 'a'), звезда (U + 2605 = '★') и «Математическое без засечек A» (U + 1D5BA = '?'), и вам нужны символьные значения, тогда вам нужно закодировать вывод на основе символьного значения.Те, которые ниже 0x7f, могут быть напечатаны как шестнадцатеричные (\ x7f в строках bash), но для тех, которые ниже ~ 64K, требуется \ u2605 (для запуска), а для остальных выше 64K требуется \ U {8 шестнадцатеричных цифр} или \ U0001D5BA дляMath-A, или что-то вроде:
> star='★' math_a='?'
> locale_hex "a$star$math_a"
\X61\u2605\U0001D5BA
Но это технически будет «не по теме» для исходного вопроса - но все же это то, о чем нужно знать и учитывать.Публикация решения, которое генерирует этот вывод, будет "слишком большим количеством OT-текста" для моего удобства (надеюсь, этот Caveat не считается слишком расходящимся от исходного вопроса - так как у меня были похожие 'ord', 'hex' (и 'chr') функции, которые дали мне возможность работать в ascii, которые были серьезно сбиты с толку, когда в микс были добавлены значения по умолчанию UTF-8.
Хотя приведенные выше ответы хороши для систем только для ascii, они становятся редкими зверями в наши днитем более что кодировка символов по умолчанию для HTML5 = UTF-8.