Como imprimir caracteres de controle com seqüências de escape?

7

Eu defini a cor vermelha usando tput

red=$(tput setaf 1)

para colorir os avisos no meu programa. Isso funciona bem:

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

Mas em uma ocasião eu gostaria de imprimir a seqüência de escape como está, algo como:

\ E [31mfail

Como eu faria isso? Eu sei que o printf tem um %q flag mas ele evita outras coisas que eu não quero.

    
por helpermethod 02.07.2015 / 12:53

3 respostas

8

Parece que você quer o oposto de imprimi-las literalmente, deseja que esses caracteres de escape sejam convertidos em um formulário descritivo imprimível, como \E ou 3 , ^[ ...

Se for apenas o caractere ESC (0x1b) que você deseja converter em \E , então com ksh93 , zsh ou bash (normalmente, os mesmos que também suportam esse% não padrão%q ), você pode fazer:

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

Ou canalizar para sed $'s/\e/\\E/g'

Para uma abordagem mais genérica na conversão de caracteres não gráficos, você pode usar:

$ printf %s "$red" | od -A n -vt c # POSIX
 033   [   3   1   m
$ printf %s "$red" | sed -n l # POSIX
3[31m$
$ printf '%s\n' "${(qqqq)red}" # zsh
$'3[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
    
por 02.07.2015 / 13:25
4

Use od , hexdump , xxd ou similar para imprimir dados binários em formato legível. Por exemplo:

$ tput setaf 1 | od -c
0000000 033   [   3   1   m
0000005
    
por 02.07.2015 / 14:45
1

Você pode usar printf diretamente, por exemplo

printf "3[31mfail"
    
por 02.07.2015 / 13:07