web-dev-qa-db-ja.com

エスケープシーケンスで制御文字を印刷する方法は?

Tputを使用して赤を定義しました

red=$(tput setaf 1)

私のプログラムの警告を色分けします。これはうまくいきます:

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

しかし、ある場合には、次のようなエスケープシーケンスをそのまま出力します。

\ E [31mfail

どうすればいいですか? printfには%qフラグですが、私がやりたくないものをエスケープします。

9
helpermethod

文字どおりに印刷するのではなく、エスケープ文字を\E\033^[...などの印刷可能な説明形式に変換したい.

それが\Eに変換するESC(0x1b)文字だけの場合は、ksh93zshまたは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
10

odhexdumpxxdなどを使用して、バイナリデータを人間が読める形式で出力します。例えば:

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

printfを直接使用できます。例:

printf "\033[31mfail"
1
X Tian