리디렉션 할 때 clang이 이해할 수없는 텍스트를 생성하는 이유는 무엇입니까? <invalid sloc>

명령 출력을 파일에 저장하려고합니다. 명령은 다음과 같습니다.

clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt

그러나 결과로 나온 output.txt 파일을 열면 (ubuntu의 gedit 및 jedit에 의해) 다음과 같이 표시됩니다.

[0;1;32mTranslationUnitDecl[0m[0;33m 0x4192020[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x4192558[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __int128_t[0m [0;32m'__int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192270[0m [0;32m'__int128'[0m
[0;34m|-[0m[0;1;32mTypedefDecl[0m[0;33m 0x41925b8[0m <[0;33m<invalid sloc>[0m> [0;33m<invalid sloc>[0m implicit[0;1;36m __uint128_t[0m [0;32m'unsigned __int128'[0m
[0;34m| `-[0m[0;32mBuiltinType[0m[0;33m 0x4192290[0m [0;32m'unsigned __int128'[0m
...

실제로 다음과 같이 보일 때 :

TranslationUnitDecl 0x4e46020 <<invalid sloc>> <invalid sloc>
|-TypedefDecl 0x4e46558 <<invalid sloc>> <invalid sloc> implicit __int128_t '__int128'
| `-BuiltinType 0x4e46270 '__int128'
|-TypedefDecl 0x4e465b8 <<invalid sloc>> <invalid sloc> implicit __uint128_t 'unsigned __int128'
| `-BuiltinType 0x4e46290 'unsigned __int128'
...

인코딩 문제가 있다고 생각하고 파일의 인코딩을 확인하여 file -bi output.txt출력 text/plain; charset=us-ascii합니다.

인코딩을 utf-8로 변경하면 문제가 해결되므로 다음과 같이 시도했습니다.

clang -Xclang -ast-dump -fsyntax-only main.cpp | iconv -f us-ascii -t UTF-8 > output.txt

그러나 차이가 없었습니다.

이 문제를 해결하려면 어떻게해야합니까?

문제는 구문 강조 표시 된 버전을 보려고한다는 것이 아닙니다 (처음에는 그것을 보는 데 아무런 문제가 없었습니다). clang에 의해 생성 된 AST를 파일에 저장 한 다음 구문 분석해야합니다. 색상 정보가 남아 있으면 어려울 것입니다.



답변

코드 페이지 / 인코딩과는 아무런 관련이 없습니다. 출력물이 일반 텍스트가 아닙니다. 같은 시퀀스를 포함합니다 [0;1;32m. 이 문자열들 (각각 앞에 표시되지 않은 [이스케이프] 문자가 있습니다)은 텍스트 굵은 체, 이탤릭체, 다양한 색상 등을 표시하는 터미널에 대한 지시 사항입니다. 따라서 터미널의 경우 출력을보다 쉽게 ​​읽을 수 있습니다. 그것을 지원합니다.

clang에게 출력을 아름답게 만들지 말고 대신 일반 텍스트를 사용하도록 지시하는 옵션이 있어야합니다. 설명서를 확인하십시오. (핸디가 없기 때문에 적절한 명령이 무엇인지 말할 수 없습니다.)


답변

또는 출력에서 ​​색상을 제거하는 대신 원시 옵션을 사용하여 터미널에서 색상이 지정된 출력을 볼 수 있습니다. less

less -r output.txt

답변

[0;33m터미널 출력 제어와 같은 문자 는 저에게 있습니다. 그것들은 터미널에서 텍스트에 색상을 적용하는 데 자주 사용되는 일련의 이스케이프 시퀀스의 일부입니다. 이와 같은 원시 상태에서는 종종 bash 프롬프트 자체에 색상을 적용하는 데 자주 사용됩니다. 다음 .bashrc은 모든 컴퓨터에서 수년간 사용 해온 내용입니다.

export PS1='\[\033[1;33m\]\u\[\033[1;35m\]@\[\033[1;32m\]\h\[\033[0;36m\]\w\[\033[1;37m\]\$ \[\033[0;37m\]'

(대부분 그것이 추악하다고 생각하지만, 나는 그것을 좋아합니다).

명령 출력에서 ​​색상 코딩 등을 제거 할 수있는 스위치를 찾고 도움이되는지 확인하십시오.