列命令和颜色转义代码的问题

列命令和颜色转义代码的问题

我正在对格式化的表格标题进行着色column -ts $'\t'

在没有颜色代码的情况下效果很好,但是当我将颜色代码添加到第一行时,column输出无法正确对齐。

没有彩色输出它可以工作正如预期的那样:
printf "1\t2\t3\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t'

但是在第一行列上添加颜色时不对齐彩色行的文本:
printf "\e[7m1\t2\t3\e[0m\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t'

在 Ubuntu Linux 和 Mac OS X 上都观察到了这种行为。

答案1

是的,那是因为颜色代码也被格式化column。他们和其他人一样都是角色。既然您已经在使用printf,您也可以使用它来为您进行格式化:

$ printf '\e[7m%-24s%-8s%-6s\e[0m\n%-24s%-8s%-6s\n' "1" "2" "3" "asdasdasdasdasdasdasd" "qwe" "qweqwe"
1                       2       3     
asdasdasdasdasdasdasd   qwe     qweqwe

或者,您可以添加颜色代码使用column

$ printf "1\t2\t3\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n" | column -ts $'\t' | 
    sed "1{s/^/$(printf '\e[7m')/;s/$/$(printf '\e[0m')/}"
1                      2    3   # this line is colored
asdasdasdasdasdasdasd  qwe  qweqwe

答案2

我想它column不知道这\e[7m是一个在输出中不占用空间的 v100 转义序列。似乎假设八进制字符代码 0 到 037 不占用空格。您可以通过将初始转义序列放在其自己的行上,然后从输出中删除该换行符来获得所需的内容:

printf '\e[7m\n1\t2\t3\e[0m\nasdasdasdasdasdasdasd\tqwe\tqweqwe\n' | 
column -ts $'\t' |
sed '1{N;s/\n//}'

答案3

从下一个版本 v2.40 开始实用程序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

相关内容