エスケープシーケンスを使用して制御文字を印刷するには?

エスケープシーケンスを使用して制御文字を印刷するには?

tputを使って赤を定義しました。

red=$(tput setaf 1)

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

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

しかし、一度はエスケープシーケンスをそのまま印刷したいと思います。たとえば、次のようになります。

\E[31m 失敗

どうすればいいですか? printfのフラグがあることを知っていますが、%qエスケープしたくない他のものをエスケープします。

答え1

文字通り印刷する代わりに、これらのエスケープ文字を、または\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

答え2

od、または同様の方法を使用して、人間が読める形式でバイナリデータを印刷しますhexdumpxxdたとえば、

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

答え3

printfたとえば、直接使用できます。

printf "\033[31mfail"

関連情報