Làm thế nào để in các ký tự điều khiển với các chuỗi thoát?


9

Tôi đã xác định màu đỏ bằng cách sử dụng tput

red=$(tput setaf 1)

để tô màu các cảnh báo trong chương trình của tôi. Điều này hoạt động tốt:

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

Nhưng trong một dịp, tôi muốn in ra trình tự thoát như hiện tại, đại loại như:

\ E [31 phút

Làm thế nào tôi sẽ làm điều này? Tôi biết printf có một %qlá cờ nhưng nó thoát khỏi những thứ khác mà tôi không muốn.


Có phải đó chỉ là ký tự ESC (0x1b) mà bạn muốn chuyển đổi thành \Ehoặc các ký tự điều khiển khác?
Stéphane Chazelas

Câu trả lời:


10

Âm thanh như bạn muốn điều ngược lại in ấn chúng theo nghĩa đen, bạn muốn những ký tự thoát chuyển đổi sang một hình thức mô tả có thể in được như \Ehoặc \033, ^[...

Nếu đó chỉ là ký tự ESC (0x1b) mà bạn muốn chuyển đổi thành \E, thì với ksh93, zshhoặc bash(thông thường, các ký tự tương tự cũng hỗ trợ không chuẩn đó %q), bạn có thể thực hiện:

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

Hoặc đường ống đến sed $'s/\e/\\\\E/g'

Đối với cách tiếp cận chung hơn trong việc chuyển đổi các ký tự phi đồ họa, bạn có thể sử dụng:

$ 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

Sử dụng od, hexdump, xxd, hoặc tương tự để in dữ liệu nhị phân trong hình dạng con người có thể đọc được. Ví dụ:

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

1

Bạn có thể sử dụng printftrực tiếp, vd

printf "\033[31mfail"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.