이스케이프 시퀀스로 제어 문자를 인쇄하는 방법은 무엇입니까?


9

tput을 사용하여 빨간색을 정의했습니다.

red=$(tput setaf 1)

내 프로그램에서 경고를 채색합니다. 이것은 잘 작동합니다.

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

1

printf직접 사용할 수 있습니다 ( 예 :

printf "\033[31mfail"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.