关于c#:bash列命令与ANSI颜色转义混淆

关于c#:bash列命令与ANSI颜色转义混淆

我有一个来自Gary Bernhardt 的点文件它会打印出最近 git 提交的漂亮彩色列表。它使用命令column将输出排列成列。在我的 Mac 上,它运行良好。

然而奇怪的是,当我在 Cygwin 或 CentOS 6 上运行它时,列位不起作用。所有字段之间都有三个空格,无论它们的长度如何,都会在“列”之间产生锯齿状的间距。我已将其缩小到 ANSI 颜色转义码。如果我删除它们,列就会对齐。

这三个版本的 zsh 是相同的(而且问题在 bash 中出现的方式完全相同)。我无法判断的版本是什么column,但它们看起来完全相同,而且它们的手册页也完全相同。

为什么这在我的 Mac 上可以运行,但在其他操作系统上却不行?

答案1

从下一个版本 v2.40 开始util-linux/柱子将处理包含的文本Fe 转义序列ANSI 转义码适当地。

这一改变,输出具有 ANSI 序列的文本的程序将被正确处理,如以下示例所示:

$ tput cols
108

$ echo BEFORE; ls -1 --sort=time --color=always | head -n 19 | column
BEFORE
column-test.sh  test_enosys             test_pathnames
column-pr.md                    test_mkfds              test_sha1
tests                   test_uuid_namespace     lib
ansiescape-test.txt             test_tiocsti            test_md5
column                  test_sigreceive         test_byteswap
text-utils              test_sysinfo
column-old.c                    test_strerror

$ echo REFERENCE; ls -1 --sort=time --color=never | head -n 19 | column
REFERENCE
column-test.sh          text-utils              test_tiocsti            test_sha1
column-pr.md            column-old.c            test_sigreceive         lib
tests                   test_enosys             test_sysinfo            test_md5
ansiescape-test.txt     test_mkfds              test_strerror           test_byteswap
column                  test_uuid_namespace     test_pathnames

$ echo AFTER; ls -1 --sort=time --color=always | head -n 19 | column
AFTER
column-test.sh          text-utils              test_tiocsti            test_sha1
column-pr.md            column-old.c            test_sigreceive         lib
tests                   test_enosys             test_sysinfo            test_md5
ansiescape-test.txt     test_mkfds              test_strerror           test_byteswap
column                  test_uuid_namespace     test_pathnames

答案2

column按字符进行工作。它计算每个单元格的可打印字符,然后填充以对齐它们(参见代码源适用于 v2.29)。

您面临的问题是您的流包含不可打印的ANSI 转义序列嵌入可打印字符。column然后无法计算这些单元格的实际单元格最小宽度,并且使同一行的下一个单元格未对齐。


<esc>[34m以下是单元格颜色代码为蓝色的示例A,使用列 v2.29:

$ echo '\033[34mA\033[0m B\nC D'|column -t
A  B
C         D

A由于只有两个转义字符被检测为不可打印,因此单元格被视为高度可打印字符长。因此,C 列被赋予了七个不需要的填充空格。


请注意,此行为在各个版本的 column 中并不一致。版本 2.26 使用wcswidth计算单元格可见宽度并导致不同的错位。

答案3

对于任何来到这里并且有兴趣获得column类似输出的人来说,但是颜色代码美国国家标准转义序列,我制作了一个版本,它具有相同的语法(对于column支持的标志)并呈现输出符合预期

我在网上找到了各种解决方案,但它们都使用了Bash循环,与Perl,我用过。

您可以找到脚本这里

它可以直接执行(./column_ansi.sh [--options])或获取(source ./column_ansi.sh,在这种情况下命令将作为 可用column_ansi

答案4

命令可能会column查看$TERM和/或$LANG了解什么(如果有的话)构成了颜色代码。

当然,您可以直接使用git log --pretty=format:...来输出列对齐的颜色编码日志。例如,我使用git hist并在 中有这个~/.git/config

[alias]
   hist = log --pretty=format:\"           \t%C(yellow)%h %C(red)%ad %C(cyan)%aN%C(reset)   \t| %s%C(blue)%d%C(reset)\" --graph --date=short

相关内容