Я хотел вывести строку всех символов ascii с помощью следующей команды
for i in `seq 32 127`; do printf "%c" $i; done
Вывод вышеуказанной команды:
33333334444444444555555555566666666667777777777..............
Это первая (слева) цифра каждого числа.
Просматривая этот сайт, я наткнулся на ответ на мою проблему. Как напечатать все печатные символы ASCII в CLI? Однако я до сих пор не понимаю, почему мой оригинальный фрагмент не выводит символы ascii, как предполагалось.
bash
shell
character-encoding
ascii
Ifthikhan
источник
источник
comp.unix.shell
ветка о том, почему это правильно;)
Ответы:
Вы не можете напрямую распечатать коды ASCII, используя
printf "%c" $i
как в C.Сначала вы должны преобразовать десятичное значение i в восьмеричное значение, а затем распечатать его, используя
printf
и поставив\
перед ними восьмеричные значения.Чтобы напечатать
A
, вы должны преобразовать десятичное 65 в восьмеричное, то есть 101, и затем вы должны напечатать это восьмеричное значение как:Это напечатает
A
.Таким образом, вы должны изменить его на:
Но с помощью
awk
вы можете напрямую печатать как на языке Сиисточник
bash
иzsh
это может быть сделано без петли и без внешней команды:printf $(printf '\%o' {32..127})
.(char)(127)
забой или что-то в этом роде. Что бы это ни было, оно выглядит как один из шестиугольников или как их там называют. Если вы хотите только «печатный» (то есть читаемый), просто перейдите к 126. Кроме того, хорошая мысль с восьмеричным. Это умно; Я думал с точки зрения шестнадцатеричного (напримерprintf '\x%x; {32..126}
... или 127, я думаю, так как все вы тоже это сделали), но это не работает. Октал спасает день! :) Наконец, @Ifthikhan, я не уверен, что ты имеешь в виду.awk
часто использует команды в стиле C и больше нигде не%c
используется. Использование восьмеричных чисел отличается от использования однобайтовых символов.%c
Интерпретирует связанный аргумент как char: печатается только первый символ данного аргументаКажется, у вас уже есть способ напечатать их, но вот один из вариантов.
источник
Вам нужно
printf
, но только один раз; Вы можете заменить одно использованиеprintf
на более простую и эффективную,echo
а также escape-последовательность Bash:С шестнадцатеричными числами:
С восьмериками:
источник