通过bash在tput结果上使用column命令

时间:2018-12-13 20:37:12

标签: bash tput

我有一个变量“ x”,它包含两列和两行。我想用红色打印“ hi”,所以我使用了tput,它以红色打印了结果。但是我也需要按照使用column -t的方式正确对齐列,但是这会使输出失真。这是因为事实是,通过tput添加了一些控制字符。

x="hello $(tput setaf 1)hi $(tput sgr0) whatsup
hey howdy cya"


echo "$x"
hello hi  whatsup
hey howdy cya

echo "$x"|column -t
hello  hi              whatsup
hey    howdy  cya

我期望:

hello  hi     whatsup
hey    howdy  cya

试图调试,发现tput正在添加一些控制字符以使“ hi”打印为红色。

echo "$x"|cat -A
hello ^[[31mhi ^[(B^[[m whatsup$
hey howdy cya$

问题:

如何在tput的彩色输出上“ column -t”?

编辑:@Diego Torres Milano的结果(全部为红色)

hello  31mhi  Bm  whatsup
hey    howdy   cya

1 个答案:

答案 0 :(得分:0)

您可以使用一种简化的标记,在这种情况下,将^A用作红色(使用vim输入 CTRL + v CTRL + a

y="hello ^Ahi whatsup
hey howdy ya"

echo "$y"|column -t|sed -E "s@^A([[:alnum:]]+)@$(tput setaf 1)\1$(tput sgr0)@g"

并且输出符合预期(hi为红色):

hello  hi     whatsup
hey    howdy  ya

编辑

如果您的column计算了控制字符,请使用未出现在值中的任何字符,然后替换它们,例如

y="|hello !hi |whatsup
|hey |howdy |ya"

echo "$y"|column -t|sed -E "s@\\|@@g; s@!([[:alnum:]]+)@$(tput setaf 1)\1$(tput sgr0)@g;"

产生

column color