tputを使って赤を定義しました。
red=$(tput setaf 1)
私のプログラムで警告の色を指定します。これはうまくいきます:
printf '%sfail\n' "$red"
# prints 'fail' in red
しかし、一度はエスケープシーケンスをそのまま印刷したいと思います。たとえば、次のようになります。
\E[31m 失敗
どうすればいいですか? printfのフラグがあることを知っていますが、%q
エスケープしたくない他のものをエスケープします。
答え1
文字通り印刷する代わりに、これらのエスケープ文字を、または\E
、\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"