我正在尝试将命令的输出保存到文件中。命令是:
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 保存到文件中,然后对其进行解析,如果保留了颜色信息,这将很困难。
答案1
它与代码页/编码无关。您的输出不是纯文本。它包含类似 的序列[0;1;32m
。这些字符串(每个字符串前面都有一个 [escape] 字符,未显示)是指示终端以粗体、斜体、各种颜色等显示文本的指令。如果您的终端支持,这会使输出更易于阅读。
应该有一个选项可以告诉 clang 不要尝试美化输出,而是使用纯文本。查看手册。(我手边没有手册,所以我不能告诉你正确的命令是什么。)
答案2
或者,你可以使用 raw 选项在终端中查看彩色输出,而不是从输出中删除颜色less
less -r output.txt
答案3
这些字符,例如[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\]'
(大多数人认为它很丑,但我喜欢它)。
看看您是否能够找到一个开关来从命令输出中删除任何颜色编码或类似内容,看看是否有帮助。