Comment imprimer des caractères de contrôle avec des séquences d'échappement?

9

J'ai défini la couleur rouge en utilisant tput

red=$(tput setaf 1)

pour coloriser les avertissements dans mon programme. Cela fonctionne bien:

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

Mais une fois, je voudrais imprimer la séquence d'échappement telle quelle, quelque chose comme:

\ E [31mfail

Comment pourrais-je faire ça? Je sais que printf a un %qdrapeau mais il échappe aux autres trucs que je ne veux pas.

méthode d'aide
la source
Est-ce uniquement le caractère ESC (0x1b) que vous souhaitez convertir \Eou d'autres caractères de contrôle?
Stéphane Chazelas

Réponses:

10

On dirait que vous voulez le contraire de les imprimer littéralement, vous voulez que ces caractères d'échappement soient convertis en une forme descriptive imprimable comme \Eou \033, ^[...

Si c'est juste le caractère ESC (0x1b) que vous souhaitez convertir \E, puis avec ksh93, zshou bash(généralement, les mêmes qui prennent également en charge ce non standard %q), vous pouvez faire:

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

Ou un tuyau vers sed $'s/\e/\\\\E/g'

Pour une approche plus générique de conversion de caractères non graphiques, vous pouvez utiliser:

$ 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
la source
5

Utilisez od, hexdump, xxdou similaire à imprimer des données binaires sous forme lisible par l' homme. Par exemple:

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

Vous pouvez utiliser printfdirectement, par exemple

printf "\033[31mfail"
X Tian
la source