Tputを使用して赤を定義しました
red=$(tput setaf 1)
私のプログラムの警告を色分けします。これはうまくいきます:
printf '%sfail\n' "$red"
# prints 'fail' in red
しかし、ある場合には、次のようなエスケープシーケンスをそのまま出力します。
\ E [31mfail
どうすればいいですか? printfには%q
フラグですが、私がやりたくないものをエスケープします。
文字どおりに印刷するのではなく、エスケープ文字を\E
や\033
、^[
...などの印刷可能な説明形式に変換したい.
それが\E
に変換するESC(0x1b)文字だけの場合は、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
od
、hexdump
、xxd
などを使用して、バイナリデータを人間が読める形式で出力します。例えば:
$ tput setaf 1 | od -c
0000000 033 [ 3 1 m
0000005
printf
を直接使用できます。例:
printf "\033[31mfail"