【问题标题】:How to get color and width formatting with printf如何使用 printf 获取颜色和宽度格式
【发布时间】:2021-08-10 19:19:20
【问题描述】:

我有一个使用printf 的简单最小宽度格式,就像这样

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

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

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

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

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

【问题讨论】:

  • 你是对的!如果你把它作为答案,我很乐意接受它

标签: bash printf


【解决方案1】:

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

最小的工作示例:

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

【讨论】:

    【解决方案2】:

    这...

    printf "[\x1b[34;1m%-15s\x1b[0m][\e[33;1m%-10s\e[0m][\e[31;5m%-5s\e[0m][\e[32m%-10s\e[0m]\n" "Hello" "World" "Eat" "Cake"
    

    ...在我的 bash 中工作。

    为了更好地处理,首先创建一个 4 列格式的环境变量以供以后使用...

    FRMT_BYRG_4COLS='[\x1b[34;1m%-15s\x1b[0m][\e[33;1m%-10s\e[0m][\e[31;5m%-5s\e[0m][\e[32m%-10s\e[0m]\n'
    

    ...并将它与 4 列输出的所有内容一起使用...

    printf "${FRMT_BYRG_4COLS}" $(ps)
    

    printf 循环通过$(ps) 4 列输出)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 1970-01-01
      • 2011-02-26
      • 1970-01-01
      • 2020-07-10
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多