¿Cómo imprimir caracteres de control con secuencias de escape?

9

He definido el color rojo usando tput

red=$(tput setaf 1)

para colorear las advertencias en mi programa. Esto funciona bien:

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

Pero en una ocasión me gustaría imprimir la secuencia de escape tal como está, algo así como:

\ E [31mfail

¿Cómo haría esto? Sé que printf tiene una %qbandera pero escapa de otras cosas que no quiero.

método de ayuda
fuente
¿Es solo el carácter ESC (0x1b) al que desea convertir \Eu otros caracteres de control?
Stéphane Chazelas

Respuestas:

10

Parece que quiere lo contrario de imprimirlos literalmente, quiere que esos caracteres de escape se conviertan en una forma descriptiva imprimible como \Eo \033, ^[...

Si es solo el carácter ESC (0x1b) al que desea convertir \E, entonces con ksh93, zsho bash(típicamente, los mismos que también admiten ese no estándar %q), puede hacer:

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

O canalizar a sed $'s/\e/\\\\E/g'

Para un enfoque más genérico en la conversión de caracteres no gráficos, puede usar:

$ 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
Stéphane Chazelas
fuente
5

Uso od, hexdump, xxd, o similar a imprimir datos binarios en forma legible por humanos. Por ejemplo:

$ tput setaf 1 | od -c
0000000 033   [   3   1   m
0000005
lcd047
fuente
1

Puede usar printfdirectamente, por ejemplo

printf "\033[31mfail"
X Tian
fuente