Wie drucke ich Steuerzeichen mit Escape-Sequenzen?

9

Ich habe die Farbe Rot mit tput definiert

red=$(tput setaf 1)

Warnungen in meinem Programm einzufärben. Das funktioniert gut:

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

Aber einmal möchte ich die Escape-Sequenz so ausdrucken, wie sie ist, so etwas wie:

\ E [31mfail

Wie würde ich das machen? Ich weiß, dass printf eine %qFlagge hat, aber es entgeht anderen Dingen, die ich nicht will.

Hilfsmethode
quelle
Ist es nur das ESC-Zeichen (0x1b), in das Sie konvertieren möchten \E, oder andere Steuerzeichen?
Stéphane Chazelas

Antworten:

10

Klingt wie Sie das Gegenteil wollen , dass sie buchstäblich zu drucken, möchten Sie diese Escape - Zeichen in eine druckbare beschreibende Form umgewandelt wie \Eoder \033, ^[...

Wenn es nur die ESC (0x1b) Zeichen , das Sie konvertieren möchten \E, dann mit ksh93, zshoder bash( in der Regel die gleichen, die auch , dass die Nicht-Standard unterstützen %q), können Sie tun:

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

Oder Pfeife zu sed $'s/\e/\\\\E/g'

Für einen allgemeineren Ansatz beim Konvertieren nicht grafischer Zeichen können Sie Folgendes verwenden:

$ 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
quelle
5

Verwendung od, hexdump, xxdoder ähnliche binäre Daten in menschenlesbarer Form zu drucken. Zum Beispiel:

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

Sie können printfdirekt verwenden, z

printf "\033[31mfail"
X Tian
quelle