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


29

리눅스와 솔라리스 모두에서 작동 해야하는 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'명령을 변경할 수 없습니다. 실제로 실행중인 명령을 채우기 때문입니다.

답변:


35

\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),"

이것은 cat |sed너무 thx 에 색을 입히는 데 효과적입니다 !
물병 자리 힘

8

사용하기 쉬울 것입니다 tput

tput setaf 1; somecommand; tput sgr0

또는

tput setaf 1
somecommand
tput sgr0

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

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


답변 주셔서 감사합니다. 앞에서 말했듯이 echo 명령을 변경할 수 없습니다. '에코'는 내가 부르고있는 프로세스를위한 스탠드 인으로 변경할 수 없습니다. 어떻게 든 sed를 tput과 함께 사용할 수 있습니까? 또한 sunOS 5.10에서 해당 명령을 실행할 때 색상이 표시되지 않습니다.
acm

별도의 명령으로 분리하기 위해 업데이트했습니다.
바하마

이것은 솔라리스에서 원시 ASCII 코드를 인쇄하지 않는다는 점에서 현재 구현보다 낫습니다. 그러나 (어떤 이유로 든) 솔라리스에서 'somecommand'의 출력을 채색하지 않습니다. 그것은 리눅스에서 않습니다. @Gilles 답변을 수락했습니다. 고맙습니다.
acm

0

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

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

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

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

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