我正在对格式化的表格标题进行着色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