grep을 사용할 때 화면에 이상한 기호가 있습니까?


12

./trans ... 이스케이프 코드를 보여주는 명령 출력

이 문제를 일으킬 수있는 아이디어가 있습니까? grep을 사용하지 않으면 ISO 코드와 빈 공간 만 표시됩니다.

사용 된 소프트웨어

명령: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

정상 출력 :

읽을 수있는 텍스트 및 URL이 포함 된 trans 명령 출력


이미지를 첨부하는 대신 출력물을 붙여 넣으십시오. 다른 사람들이 붙여 넣은 명령을 재사용하여 시스템에서 동일한 명령을 재현 할 수 있도록
Thushi

9
@Thushi이 경우 스크린 샷은 누락 된 글리프 기호를 여기에 붙여 넣을 수 없으므로 적절합니다.
Sparhawk

당신은 할 수 편집 명령의 스크린 샷에서이 후행없이 실행 grep의, 그리고 결과 alias greptype grep?
Michael Homer

답변:


28

스크린 샷은 텍스트 렌더링을 제어하는 엉킨 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를 사용하지 않으며 자체 코드에서 이해하는 터미널 유형과 사용하는 제어 시퀀스를 고정 배선합니다.


와우, 나 혼자서 이런 식으로 디버깅 할 수 없을 것이므로 감사합니다!
Freedo

IMO 범인은 단순히 숫자가 아닌 완전한 SGR 이스케이프 시퀀스를 포함 하는 파손 GREP_COLOR되거나 GREP_COLORS환경 변수 일 수 있습니다.
egmont

와우, 너무 많은 솔루션. --color=no최종 그렙에 추가 하거나 적용 할 TERM=dumb수 있습니다
Ángel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.