如何打印带有转义序列的控制字符?


9

我已经用tput定义了红色

red=$(tput setaf 1)

为我的程序中的警告着色。这工作正常:

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

但是有一次我想按原样打印转义序列,例如:

\ E [31mfail

我该怎么做?我知道printf有一个%q标志,但是它可以逃避其他我不想要的东西。


您只是要将ESC(0x1b)字符转换为\E,还是其他控制字符?
斯特凡Chazelas

Answers:


10

听起来好像您想要按原样打印它们相反,您希望将那些转义字符转换为可打印的描述形式,例如\E\033^[...

如果只是要转换到ESC(0x1b)字符\E,然后用ksh93zshbash(通常,这也支持非标准相同的人%q),你可以这样做:

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

或通过管道 sed $'s/\e/\\\\E/g'

有关转换非图形字符的更通用方法,可以使用:

$ 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

使用odhexdumpxxd,或类似的在人类可读的形式来打印的二进制数据。例如:

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

1

您可以printf直接使用,例如

printf "\033[31mfail"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.