스크린 샷은 텍스트 렌더링을 제어하는 엉킨 ANSI 색상 코드 를 보여줍니다 . 굵게 / 밝은 텍스트는 시퀀스로 생성되며 ␛[1m
일반적으로 터미널에서 해석되며 화면에 직접 표시되지 않습니다. 다음 텍스트를 밝게 만듭니다. grep
출력 되지 않은 출력 의 스크린 샷은 각 줄의 레이블과 값 사이의 색상 차이가 표시되므로 원래 출력에서이를 사용합니다.
해당 시퀀스가 final에 의해 끊어졌으며 grep
코드의 "m"(문자이므로 [a-z]
)과 일치하고 빨간색 자체로 강조하려고했습니다. 터미널에서 처리 할 수없는 부분 이스케이프 시퀀스가 남았습니다.
이스케이프 문자 ␛
는 U + 001B이며 알 수없는 문자 상자에 렌더링되는 16 진수입니다. 표시되는 것은 이스케이프 (상자), a [
, a 1
, 빨간색 m
뒤에 예상되는 일치하는 텍스트 "eng"이오고 마지막에 "22"( "정상 색상 및 강도"의 숫자 코드)로 표시됩니다.
깨진 출력은 실제로 다음과 같습니다.
␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m)
여기서 ␛[31m
텍스트를 빨간색으로 만들고 ␛[22m
흰색으로 되돌립니다. 둘 다 문자 grep
주위 m
에 원본 텍스트에 삽입됩니다 . 원본은 다음과 같습니다.
␛ [1m eng ␛ [22m
밝은 " eng
"다음 일반 텍스트로 다시 전환됩니다.
파이널을 grep
로 변경 grep --color=always
하고로 파이핑 하여이를 확인할 수 있습니다. 그러면 hexdump
인쇄 할 수없는 모든 문자와 터미널에서 해석 한 문자가 표시됩니다.
이 몇 가지 방법으로 처리 할 수 있습니다. 하나는 grep
현재 별명없이 사용 하는 것입니다.
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
백 슬래시는 일시적으로 별명을 건너 뛰고 grep
직접 실행 됩니다.
다른 하나는 원래 명령에서 ANSI 코드를 제거하는 것 입니다.이 질문에 대한 제안 이 있습니다 .
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
또 다른 옵션은 끝에 외부 파이프를 추가하는 것입니다.
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
최종 grep
출력은 TTY에 직접가 아니라 cat
파이프 를 통해 출력 되므로 색상이 지정된 강조 표시를 삽입하지 않습니다.
아마도 가장 좋은 옵션은 터미널이 아닌 터미널에서 Translate Shell이 자체 출력에서 터미널 제어 시퀀스 사용을 중지하도록하는 것입니다. 그것은 당신에게서 저자에게 버그 보고서와 Translate Shell의 ansi()
기능에 대한 코드 수정을 올바르게 포함 하지만, 어느 정도는 그것을 피할 수 있습니다.
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
이것은 dumb
번역 쉘 환경에서 터미널 유형을 전달하며 ECMA-48 색상 지원이없는 것으로 인식합니다. 슬프게도 Translate Shell은 terminfo를 사용하지 않으며 자체 코드에서 이해하는 터미널 유형과 사용하는 제어 시퀀스를 고정 배선합니다.