Як надрукувати контрольні символи за допомогою послідовностей втечі?


9

Я визначив колір червоний за допомогою tput

red=$(tput setaf 1)

розфарбувати попередження в моїй програмі. Це добре працює:

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

Але одного разу я хотів би роздрукувати послідовність втечі як є, щось на кшталт:

\ E [31mfail

Як би я це зробив? Я знаю, що у printf є %qпрапор, але він уникає інших речей, яких я не хочу.


Це просто символ ESC (0x1b), який ви хочете перетворити \E, або інші символи управління?
Стефан Шазелас

Відповіді:


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

1

Ви можете використовувати printfбезпосередньо, наприклад

printf "\033[31mfail"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.