Bagaimana cara mencetak karakter kontrol dengan urutan melarikan diri?

9

Saya telah mendefinisikan warna merah menggunakan tput

red=$(tput setaf 1)

untuk mewarnai peringatan di program saya. Ini berfungsi dengan baik:

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

Tetapi pada satu kesempatan saya ingin mencetak urutan melarikan diri apa adanya, seperti:

\ E [31m gagal

Bagaimana saya melakukan ini? Saya tahu printf memiliki %qbendera tetapi lolos dari hal-hal lain yang tidak saya inginkan.

metode helpermet
sumber
Apakah hanya karakter ESC (0x1b) yang ingin Anda konversi \E, atau karakter kontrol lainnya?
Stéphane Chazelas

Jawaban:

10

Kedengarannya seperti Anda ingin kebalikan dari mencetaknya secara harfiah, Anda ingin agar karakter yang lolos diubah menjadi bentuk deskriptif yang dapat dicetak seperti \Eatau \033, ^[...

Jika hanya karakter ESC (0x1b) yang ingin Anda konversi \E, kemudian dengan ksh93, zshatau bash(biasanya, karakter yang sama yang juga mendukung non-standar %q), Anda dapat melakukan:

printf '%s\n' "${red//$'\e'/\\E}"

Atau pipa ke sed $'s/\e/\\\\E/g'

Untuk pendekatan yang lebih umum dalam mengonversi karakter non-grafis, Anda dapat menggunakan:

$ 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
Stéphane Chazelas
sumber
5

Gunakan od, hexdump, xxd, atau mirip dengan mencetak data biner dalam bentuk manusia-dibaca. Sebagai contoh:

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

Anda dapat menggunakan printfsecara langsung, mis

printf "\033[31mfail"
X Tian
sumber