我已经使用 tput 定义了红色
red=$(tput setaf 1)
对我的程序中的警告进行着色。这工作正常:
printf '%sfail\n' "$red"
# prints 'fail' in red
但有一次我想按原样打印转义序列,例如:
\E[31m失败
我该怎么做?我知道 printf 有一个%q
标志,但它转义了我不想转义的其他内容。
答案1
听起来您想要与字面打印相反,您希望将这些转义字符转换为可打印的描述性形式,例如\E
or \033
, ^[
...
如果您只想转换为 ESC (0x1b) 字符\E
,则使用ksh93
,zsh
或bash
(通常,也支持非标准 的相同字符%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
使用od
、hexdump
、xxd
或类似方法以人类可读的形式打印二进制数据。例如:
$ tput setaf 1 | od -c
0000000 033 [ 3 1 m
0000005
答案3
您可以printf
直接使用,例如
printf "\033[31mfail"