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

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

我已经使用 tput 定义了红色

red=$(tput setaf 1)

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

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

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

\E[31m失败

我该怎么做?我知道 printf 有一个%q标志,但它转义了我不想转义的其他内容。

答案1

听起来您想要与字面打印相反,您希望将这些转义字符转换为可打印的描述性形式,例如\Eor \033, ^[...

如果您只想转换为 ESC (0x1b) 字符\E,则使用ksh93,zshbash(通常,也支持非标准 的相同字符%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

答案2

使用odhexdumpxxd或类似方法以人类可读的形式打印二进制数据。例如:

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

答案3

您可以printf直接使用,例如

printf "\033[31mfail"

相关内容