mao*_*aou 23 linux shell clang
我正在尝试将命令的输出保存到文件中。命令是:
clang -Xclang -ast-dump -fsyntax-only main.cpp > output.txt
Run Code Online (Sandbox Code Playgroud)
但是,打开时生成的 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
...
Run Code Online (Sandbox Code Playgroud)
当它真的应该是这样的:
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'
...
Run Code Online (Sandbox Code Playgroud)
我以为可能是编码问题,我检查了文件的编码,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
Run Code Online (Sandbox Code Playgroud)
但这并没有什么不同。
我能做些什么来解决这个问题?
问题不在于我试图查看语法突出显示的版本(首先我没有问题)。我需要将 clang 生成的 AST 保存到一个文件中,然后对其进行解析,如果保留颜色信息,这将很困难。
Ton*_*nny 55
它与代码页/编码无关。您的输出不是纯文本。它包含像[0;1;32m. 这些字符串(在每个字符串之前还有一个未显示的 [escape] 字符)是对终端的指令,以显示粗体、斜体、各种颜色等的文本。如果您的终端,这会导致更易于阅读的输出支持它。
应该有一个选项告诉 clang 不要尝试美化输出,而是使用纯文本。检查手册。(我手边没有,所以我不能告诉你正确的命令是什么。)
小智 12
或者,您可以使用原始选项在终端中查看彩色输出,而不是从输出中删除颜色 less
less -r output.txt
Run Code Online (Sandbox Code Playgroud)