¿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.


¿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

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

1

Puede usar printfdirectamente, por ejemplo

printf "\033[31mfail"
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.