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

9

Eu defini a cor vermelha usando tput

red=$(tput setaf 1)

para colorir 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 sequência de escape como está, algo como:

\ E [31mfail

Como eu faria isso? Eu sei que printf tem uma %qbandeira, mas ela escapa de outras coisas que eu não quero.

helpermethod
fonte
É apenas o caractere ESC (0x1b) que você deseja converter \Eou outros caracteres de controle?
Stéphane Chazelas

Respostas:

10

Parece que você quer o oposto de imprimi-los, literalmente, você quer que os caracteres de escape convertido a uma forma descritiva de impressão como \Eou \033, ^[...

Se é apenas o caráter ESC (0x1b) que deseja converter para \E, em seguida, com ksh93, zshou bash(tipicamente, os mesmos que também suportam que não-padrão %q), você pode fazer:

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

Ou canalize 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
\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
fonte
5

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
lcd047
fonte
1

Você pode usar printfdiretamente, por exemplo

printf "\033[31mfail"
X Tian
fonte