首页 > 解决方案 > 如何使用 printf 获取颜色和宽度格式

问题描述

我有一个简单的最小宽度格式,使用printf如下

$ printf "[%-15s][%-10s][%-5s][%-10s]\n" "Hello" "World" "Eat" "Cake"
[Hello          ][World     ][Eat  ][Cake      ]

但是当我尝试按照此处的说明为其添加一些颜色时,最小宽度格式就会消失

$ GREEN=$(tput setaf 2) && printf "[%-15s][%-10s][%-5s][%-10s]\n" "Hello" "World" "Eat" "${GREEN}Cake"
[Hello          ][World     ][Eat  ][Cake]

显然你在这里看不到它是绿色的,但是你可以看到“Cake”这个词的最小宽度已经消失了。你看不到,但也正在发生的是,“Cake”这个词的字体也发生了变化。

问题:如何更改颜色但保持最小宽度,如果可能,保持字体相同?

标签: bashprintf

解决方案


看起来该printf函数正在计算将颜色设置为输出宽度的一部分的转义序列字符。将每种颜色格式所需的字符数添加到宽度说明符应该可以解决问题。

最小的工作示例:

$ GREEN=$(tput setaf 2) && printf "[%-15s][%-10s][%-5s][${GREEN}%-10s]\n" "Hello" "World" "Eat" "Cake"
[Hello          ][World     ][Eat  ][Cake      ]

推荐阅读