sed - ANSI 확장 256 색상에 대한 올바른 색상 순서 찾기

sed - ANSI 확장 256 색상에 대한 올바른 색상 순서 찾기

현재 tail 명령을 통해 표준 ANSI 색상을 사용하기 위해 다음 명령을 사용하고 있습니다.

tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'

이것은 밝은 노란색이지만 저는 방금 bash에서 확장된 256 색상을 사용하고 있었고 주황색을 사용하고 싶었습니다. 검정색 바탕에 주황색을 주는 전경색과 배경색에 대한 올바른 번호 매기기 방식을 찾았습니다.

echo -e "\\033[40;5;95;38;5;202mhello world\\033[0m"

하지만 tail 명령과 함께 사용할 수 있는 sed 명령으로 변환할 수는 없습니다.

나는 이것을 시도했습니다 :

sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'

그러나 그것은 모든 것을 하얗게 만듭니다. 나는 시도했다:

sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'

그러나 이렇게 하면 "MAJOR" 문자열이 포함된 행이 검정색으로 만들어집니다. 또한 배경 구성표를 생략하고 주황색만 사용해 보았습니다.

sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

그러나 이것은 또한 "MAJOR"라는 단어가 포함된 줄을 검게 만드는 것 같습니다. sed가 검정색 배경에 주황색을 표시하는 올바른 ANSI 시퀀스가 ​​무엇인지 아는 사람이 있습니까? 참고로 첫 번째 예에서 사용한 sed 명령은 선택한 색상으로 전체 줄을 인쇄합니다. 단어 자체를 색칠하는 것이 아니라 새로운 색상 순서를 사용하여 동일한 동작이 필요합니다.

고쳐 쓰다:

이것은 작동합니다:

sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\1\o033[40;5;95m/'

그러나 보조 마젠타 색상을 포함하지 않는 다른 줄은 그대로 둡니다. 어떻게 하면 기본값을 흰색으로 되돌릴 수 있나요? 내가 뭔가를 제대로 닫지 않았나요? tail 명령을 종료할 때 볼 수 있듯이 실제로 전체 셸의 기본 글꼴 색상을 자홍색으로 설정합니다.

답변1

예제 스크립트를 작성하면 두 가지 이상의 문제를 볼 수 있습니다.

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

생성( ^[이스케이프됨):

^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m

첫 번째 행에서 a는 ^[[93m텍스트를 노란색으로 설정하고 ^39m텍스트를 터미널의 기본 색상으로 재설정하는 aixterm 16색 이스케이프입니다.

두 번째 줄에는 종료되지 않은 이스케이프 시퀀스에 문제가 있습니다(배경을 검정색 = 40, 플래시 = 5, 95 = 밝은 자홍색 텍스트로 설정한 다음 38 및 5에서 종료되지 않은 256 색상 시퀀스를 도입하려고 시도함).

세 번째 행은 두 번째 행과 약간 다릅니다.

주요 문제는 다음 sed과 같이 표현하지 않는 한 이스케이프 문자를 내보내지 않는다는 것입니다.\o033했다여러 곳에서 하세요)

둘째, 탈옥을 올바르게 종료하지 않았습니다. 결승전은 m이 시퀀스의 일부입니다. 마지막 문자가 손실되면 전체 시퀀스가 ​​삭제될 수 있습니다. 문서를 읽는 것이 가장 좋습니다.XTerm 제어 순서.

그런데,미국 국립표준협회8개 이상의 색상을 포함하는 항목은 문서화되지 않았으므로 원래 구현(16개 색상의 경우 aixterm, 256색의 경우 xterm)을 통해 시퀀스를 참조하는 것이 덜 혼란스러울 것입니다.

전체 행만 원하는 경우기본주황색으로 강조 표시되면 (설명에 따라) 다음을 수행할 수 있습니다.

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\1\o033[m/'

그러나 이 코드는 아래와 같이 R/G/B를 사용하는 것만큼 널리 지원 5되지 않습니다 .2

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\1\o033[m/'

(128 한 번만 시도해 보세요. 취향이 다를 수 있습니다.)

추가 자료:

CSI Pm m Character Attributes (SGR).

답변2

당신은 이것을 찾고있을 수 있습니다 :

sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\1\o033[0m/'

다음과 같이 단순화할 수 있지만

sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'

변경은 배경색을 변경한다는 40의미입니다 .48

배경색을 검정색으로 하고 싶다면:

sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'

배경색이 이미 검은색이라면 전혀 변경할 필요가 없습니다.

sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'

관련 정보