Как напечатать управляющие символы с escape-последовательностями?

9

Я определил красный цвет, используя tput

red=$(tput setaf 1)

раскрасить предупреждения в моей программе. Это прекрасно работает:

printf '%sfail\n' "$red"
# prints 'fail' in red

Но в одном случае я хотел бы распечатать escape-последовательность как есть, что-то вроде:

\ E [31mfail

Как бы я это сделал? Я знаю, что у printf есть %qфлаг, но он избегает других вещей, которые я не хочу.

helpermethod
источник
Это просто символ ESC (0x1b), который вы хотите преобразовать \E, или другие управляющие символы?
Стефан Шазелас

Ответы:

10

Похоже, вы хотите, чтобы вы печатали их буквально, вы хотите, чтобы эти escape-символы были преобразованы в печатную описательную форму, например \Eили \033, ^[...

Если вы хотите преобразовать только символ ESC (0x1b) \E, то ksh93, используя zshили bash(как правило, те же, которые также поддерживают этот нестандартный %q), вы можете сделать:

printf '%s\n' "${red//$'\e'/\\E}"

Или труба к sed $'s/\e/\\\\E/g'

Для более общего подхода к преобразованию неграфических символов вы можете использовать:

$ printf %s "$red" | od -A n -vt c # POSIX
 033   [   3   1   m
$ printf %s "$red" | sed -n l # POSIX
\033[31m$
$ printf '%s\n' "${(qqqq)red}" # zsh
$'\033[31m'
$ printf '%s\n' "$red" | cat -vt # some cat implementations
^[[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Hex;' # ICU tools
\u001B[31m
$ printf %s "$red" | uconv -x ':: [:Cc:]; ::Name;' # ICU tools
\N{<control-001B>}[31m
Стефан Шазелас
источник
5

Используйте od, hexdump, xxdили аналогичный для печати двоичных данных в читабельной форме. Например:

$ tput setaf 1 | od -c
0000000 033   [   3   1   m
0000005
lcd047
источник
1

Вы можете использовать printfнапрямую, например,

printf "\033[31mfail"
X Тянь
источник