วิธีการพิมพ์อักขระควบคุมด้วย escape sequences?


9

ฉันกำหนดสีแดงโดยใช้ tput

red=$(tput setaf 1)

เพื่อ colorize คำเตือนในโปรแกรมของฉัน ใช้งานได้ดี:

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

แต่มีอยู่ครั้งหนึ่งที่ฉันต้องการพิมพ์ลำดับหลบหนีตามที่เป็นอยู่สิ่งที่ชอบ:

\ E [31mfail

ฉันจะทำสิ่งนี้ได้อย่างไร ฉันรู้ว่า printf มี%qธง แต่สิ่งอื่น ๆ ที่ฉันไม่ต้องการหลบหนี


เป็นเพียงอักขระ ESC (0x1b) ที่คุณต้องการแปลงเป็น\Eหรืออักขระควบคุมอื่น ๆ
Stéphane Chazelas

คำตอบ:


10

เสียงเหมือนคุณต้องการตรงข้ามของพวกเขาในการพิมพ์ตัวอักษรที่คุณต้องการเหล่านั้นตัวหนีแปลงเป็นรูปแบบพรรณนาพิมพ์เหมือน\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

5

การใช้งานod, hexdump, xxdหรือคล้ายกับพิมพ์ข้อมูลไบนารีในรูปแบบมนุษย์สามารถอ่านได้ ตัวอย่างเช่น:

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.