Kaçış dizileriyle kontrol karakterleri nasıl yazdırılır?


9

Tput kullanarak kırmızı rengi tanımladım

red=$(tput setaf 1)

programımdaki uyarıları renklendirmek için. Bu iyi çalışıyor:

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

Ama bir keresinde kaçış dizisini olduğu gibi yazdırmak istiyorum:

\ E [31mfail

Bunu nasıl yaparım? Printf'in bir %qbayrağı olduğunu biliyorum ama istemediğim şeylerden kaçıyor.


Yalnızca dönüştürmek istediğiniz ESC (0x1b) karakteri mi \Eyoksa diğer kontrol karakterleri mi?
Stéphane Chazelas

Yanıtlar:


10

Senin gibi Sesler anlamıyla onları baskı tersini istiyorum, o kaçış karakterleri gibi yazdırılabilir açıklayıcı forma dönüştürülür istiyorum \Eya \033, ^[...

Yalnızca dönüştürmek istediğiniz ESC (0x1b) karakteri \Eise ksh93, zshveya bash( veya genellikle, standart dışı olanları da destekleyen karakterlerle %q), şunları yapabilirsiniz:

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

Veya sed $'s/\e/\\\\E/g'

Grafik olmayan karakterleri dönüştürme konusunda daha genel bir yaklaşım için şunları kullanabilirsiniz:

$ 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

Kullanım od, hexdump, xxd, veya insan tarafından okunabilir biçimde ikili veri yazdırmak için benzer. Örneğin:

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

1

printfDoğrudan kullanabilirsiniz , örn.

printf "\033[31mfail"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.