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

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

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

red=$(tput setaf 1)

내 프로그램에서 경고 색상을 지정합니다. 이것은 잘 작동합니다:

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

하지만 한 번은 이스케이프 시퀀스를 있는 그대로 인쇄하고 싶습니다. 예를 들면 다음과 같습니다.

\E[31m 실패

어떻게 해야 합니까? printf에 대한 플래그 가 있다는 것을 알고 있지만 %q이스케이프하고 싶지 않은 다른 것을 이스케이프합니다.

답변1

문자 그대로 인쇄하는 대신 이러한 이스케이프 문자를 \E또는 \033, ^[... 과 같은 인쇄 가능한 설명 형식으로 변환하려는 것 같습니다.

ESC(0x1b) 문자로 변환하려는 경우 , 또는 (일반적으로 비표준 동일한 문자도 지원됨 )을 \E사용하여 다음을 수행할 수 있습니다.ksh93zshbash%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

답변2

od, 또는 유사한 방법을 사용하여 사람이 읽을 수 있는 형식으로 이진 데이터를 인쇄합니다 hexdump. xxd예를 들어:

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

답변3

printf예를 들어 직접 사용할 수 있습니다 .

printf "\033[31mfail"

관련 정보