如何使用转义序列打印控制字符?

hel*_*hod 9 shell escape-characters printf

我已经使用 tput 定义了红色

red=$(tput setaf 1)
Run Code Online (Sandbox Code Playgroud)

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

printf '%sfail\n' "$red"
# prints 'fail' in red
Run Code Online (Sandbox Code Playgroud)

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

\E[31mfail

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

Sté*_*las 10

听起来您想要从字面上打印它们的反面,您想要将这些转义字符转换为可打印的描述形式,例如\Eor \033, ^[...

如果它只是您想要转换为的 ESC (0x1b) 字符\E,则使用ksh93,zshbash(通常,也支持非标准的相同%q),您可以执行以下操作:

printf '%s\n' "${red//$'\e'/\\E}"
Run Code Online (Sandbox Code Playgroud)

或管道到 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
Run Code Online (Sandbox Code Playgroud)


lcd*_*047 5

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

$ tput setaf 1 | od -c
0000000 033   [   3   1   m
0000005
Run Code Online (Sandbox Code Playgroud)