Jak wydrukować znaki kontrolne z sekwencjami ucieczki?


9

Kolor czerwony zdefiniowałem za pomocą tput

red=$(tput setaf 1)

pokolorować ostrzeżenia w moim programie. Działa to dobrze:

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

Ale pewnego razu chciałbym wydrukować sekwencję ucieczki taką, jaka jest, na przykład:

\ E [31mfail

Jak mam to zrobić? Wiem, że printf ma %qflagę, ale ucieka przed innymi rzeczami, których nie chcę.


Czy to tylko znak ESC (0x1b), na który chcesz przekonwertować \E, czy inne znaki sterujące?
Stéphane Chazelas

Odpowiedzi:


10

Dźwięki tak, jak chcesz przeciwieństwo drukując je dosłownie, chcesz te znaki ewakuacyjne konwertowany do druku formie opisowej jak \Ei \033, ^[...

Jeśli to tylko (0x1b) znak ESC chcesz przekonwertować \E, a następnie ksh93, zshalbo bash(zazwyczaj te same, które również obsługują że niestandardowe %q), można zrobić:

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

Lub potok do sed $'s/\e/\\\\E/g'

Aby uzyskać bardziej ogólne podejście do konwertowania znaków innych niż graficzne, możesz użyć:

$ 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

Użyj od, hexdump, xxdlub podobny do drukowania danych binarnych w postaci czytelnej dla człowieka. Na przykład:

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

1

Możesz użyć printfbezpośrednio, np

printf "\033[31mfail"
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.