솔라리스에서 sed를 사용하여 명령 출력 색상 지정

솔라리스에서 sed를 사용하여 명령 출력 색상 지정

Linux 및 Solaris에서 실행해야 하는 ksh 스크립트가 있습니다. 특정 명령의 출력에 색상을 지정하려고 합니다. Linux(특히 RHEL6)에서는 작동하지만 Solaris(SunOS 5.10)에서는 작동하지 않습니다.

Linux의 명령(출력 "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" 명령은 실제로 실행하는 명령의 패딩일 뿐이므로 변경할 수 없습니다.

답변1

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

스크립트에 리터럴 이스케이프 문자를 포함할 수 있지만 이렇게 하면 읽고 편집하기가 어려워집니다.

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

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

전화해도됩니다tputsed 호출에서 대체 텍스트를 생성합니다. 이 명령은 이스케이프 시퀀스를 찾습니다.용어 정보데이터 베이스. 이론적으로 을 사용하면 tput스크립트의 이식성이 향상되지만 실제로는 사용하지 않는 터미널을 실행할 가능성이 줄어듭니다.ANSI 이스케이프 코드.

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

답변2

이용하시면 더욱 편리하겠습니다tput

tput setaf 1; somecommand; tput sgr0

또는

tput setaf 1
somecommand
tput sgr0

전경을 빨간색으로 설정하고 somecommand실행 후 출력을 빨간색으로 표시한 다음 색상 순서를 지웁니다. 이는 적어도 bash, zsh및 에 적용됩니다 ksh.

로 무엇을 할 수 있는지 자세히 tmux(1)알아 보십시오 .terminfo(5)tput

답변3

더 쉬운 방법도 있습니다:

이스케이프 문자에 해당하는 바이트를 정확히 확인하려면 \033다음을 수행하세요.

printf "\033" | xxd -p

당신은 얻는다

1b

따라서 이스케이프 시퀀스 \033은 2진수 바이트 0b00011011, 10진수 바이트 27 또는 16진수 바이트 1b에 해당합니다.

좋은 소식: sed는 16진수 코드를 알고 있습니다!

echo "color test" | sed 's,color,\x1b[31m&\x1b[0m,'

이것은 16진수를 알 때 더 나은 솔루션입니다.

답변4

일부 터미널(iterm의 bash와 같은)에서는 "ctrl-v"를 누른 다음 "ctrl+["를 눌러 리터럴 이스케이프 문자를 입력 문자열에 넣을 수 있습니다. 작동하면 화면에 "^[" 문자가 표시될 수 있지만 그 주위로 커서를 이동하면 실제로는 무대 뒤에 있기 때문에 하나의 문자로 처리됩니다.

무슨 일이 일어나고 있는지 확인하고 이것이 작동하는지 테스트하려면 ctrl+v를 입력한 다음 ctrl+i를 입력하면 됩니다. 프롬프트 문자열에 탭 문자가 삽입된 것을 볼 수 있습니다. CS의 역사는 이것이 왜 그런지 설명합니다. 그러나 실제로 오래된 키보드에는 ctrl+I 하드키가 있는 것으로 나타났습니다.열광한탭 문자를 보냅니다. Tab 키도 동일한 전기 신호를 보냅니다.

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

Ctrl+I는 탭 문자에 매핑되는 반면, ctrl+[는 ASCII 이스케이프 문자와 정확히 일치합니다.

관련 정보