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.


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

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

1

Vous pouvez utiliser printfdirectement, par exemple

printf "\033[31mfail"
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.