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

Nik*_*und 8 colors escape-characters table columns text-formatting

我正在为表格的标题着色 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 上都观察到了这种行为。

ter*_*don 6

是的,那是因为颜色代码也被格式化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
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用添加颜色代码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
Run Code Online (Sandbox Code Playgroud)


meu*_*euh 4

我想它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//}'
Run Code Online (Sandbox Code Playgroud)