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/'

그러나 MINOR 색상의 자홍색을 포함하지 않는 다른 줄은 남겨 둡니다. 기본값을 흰색으로 되돌리려면 어떻게 해야 합니까? 내가 뭔가를 제대로 끄지 않는 걸까요? 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/'

관련 정보