[unix] sed를 사용하여 solaris에서 명령의 출력 색상 지정

리눅스와 솔라리스 모두에서 작동 해야하는 ksh 스크립트가 있습니다. 특정 명령의 출력을 채색하려고합니다. Linux (특히 RHEL6)에서는 작동하지만 solaris (SunOS 5.10)에서는 작동하지 않습니다.

리눅스에서의 명령 (출력 “test”는 정확하게 빨간색으로 표시됩니다) :

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

solaris에 대한 명령 (출력 “test”는 색상이 지정되지 않음) :

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

출력에 원시 코드없이 출력이 빨간색이되도록이 명령을 작성하는 방법이 있습니까? ‘echo’명령을 변경할 수 없습니다. 실제로 실행중인 명령을 채우기 때문입니다.



답변

\xNN 은 GNU sed에서 이스케이프 시퀀스이지만 표준이 아니며 특히 Solaris에서 사용할 수 없습니다.

스크립트에 리터럴 이스케이프 문자를 포함시킬 수 있지만 읽고 편집하기가 어렵습니다.

printf이스케이프 문자를 생성하는 데 사용할 수 있습니다 . 16 진수가 아닌 8 진수 이스케이프를 이해합니다.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

tputsed에 대한 호출에서 대체 텍스트를 생성하기 위해 호출 할 수 있습니다 . 이 명령은 terminfo 데이터베이스 에서 이스케이프 시퀀스를 찾습니다 . 이론적으로 사용 tput하면 스크립트를 이식성이 향상되지만 실제로는 ANSI 이스케이프 코드를 사용하지 않는 터미널이 발생할 가능성이 거의 없습니다 .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"


답변

사용하기 쉬울 것입니다 tput

tput setaf 1; somecommand; tput sgr0

또는

tput setaf 1
somecommand
tput sgr0

전경을 빨간색으로 설정하고 실행합니다. somecommand 한 다음 출력을 빨간색으로 표시 한 다음 색상 순서를 지 웁니다. 이것은 적어도 bash, zshksh .

참조 tmux(1)하고 terminfo(5)당신이 무엇을 할 수 있는지에 대한 자세한 내용은 tput.


답변

일부 터미널 (예 : iterm의 bash)에서 “ctrl-v”키와 “ctrl + [“키를 누르면 문자 이스케이프 문자를 입력 문자열에 넣습니다. 작동하면 화면에 “^ [“문자가 인쇄되는 것을 볼 수 있지만 커서를 그 주변으로 움직이면 실제로 장면 뒤에 있기 때문에 한 문자로 취급합니다.

무슨 일이 일어나고 있는지 이해하고 (가능한 경우 테스트하기 위해) ctrl + v와 ctrl + i를 차례로 입력 할 수 있습니다. 프롬프트 문자에 탭 문자가 삽입 된 것을 볼 수 있습니다. 왜 그런지에 대한 CS 기록이 있습니다. 그러나 실제로 오래된 키보드에는 ctrl + I 하드 유선 이있는 것으로 나타났습니다 가 탭 문자를 보내기 위해 으로 되어 있습니다. 탭 키도 동일한 전기 신호를 보냅니다.

이러한 레거시 이유로 인해 많은 터미널의 bash는 여전히 특정 ctrl 코드를 해석하여 동일한 문자로 매핑합니다.

Ctrl + I는 탭 문자에 맵핑되며 ctrl + [는 ASCII 이스케이프 문자와 일치합니다.


답변