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


9

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

red=$(tput setaf 1)

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

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

ただし、次のようなエスケープシーケンスをそのまま出力したい場合があります。

\ E [31mfail

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


変換したいESC(0x1b)文字だけです\Eか、それとも他の制御文字ですか?
ステファンChazelas

回答:


10

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

それはちょうどあなたがに変換するESC(として0x1B)文字だ場合\E、その後で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

5

使用odhexdumpxxd、または人間が読める形式のバイナリデータを印刷すると類似。例えば:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.