Come stampare i personaggi di controllo con sequenze di escape?


9

Ho definito il colore rosso usando tput

red=$(tput setaf 1)

per colorare gli avvisi nel mio programma. Funziona bene:

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

Ma in un'occasione vorrei stampare la sequenza di escape così com'è, qualcosa del tipo:

\ E [31mfail

Come lo farei? So che printf ha una %qbandiera ma sfugge ad altre cose che non voglio.


È solo il carattere ESC (0x1b) in cui vuoi convertire \Eo altri caratteri di controllo?
Stéphane Chazelas,

Risposte:


10

Sembra che tu voglia l'opposto di stamparli letteralmente, vuoi che quei caratteri di escape vengano convertiti in una forma descrittiva stampabile come \Eo \033, ^[...

Se è solo il (0x1b) carattere ESC si desidera convertire a \E, poi con ksh93, zsho bash(in genere, gli stessi che sostengono anche che non standard %q), si può fare:

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

O pipe to sed $'s/\e/\\\\E/g'

Per un approccio più generico alla conversione di caratteri non grafici, è possibile utilizzare:

$ 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

Usa od, hexdump, xxd, o simile a stampare i dati binari in formato leggibile. Per esempio:

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

1

È possibile utilizzare printfdirettamente, ad es

printf "\033[31mfail"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.