gpt4 book ai didi

terminal - 如何阻止 ANSI 颜色代码弄乱 printf 对齐?

转载 作者:行者123 更新时间:2023-12-01 07:16:20 24 4
gpt4 key购买 nike

我在使用 ruby​​ printf 时发现了这一点,但它也适用于 C 的 printf。

如果在输出字符串中包含 ANSI 颜色转义码,则会弄乱对齐方式。

ruby :

ruby-1.9.2-head > printf "%20s\n%20s\n", "\033[32mGreen\033[0m", "Green"
Green # 6 spaces to the left of this one
Green # correctly padded to 20 chars
=> nil

C程序中的同一行产生相同的输出。

无论如何,有没有要让printf(或其他东西)对齐输出而不为未打印的字符添加空格?

这是一个错误,还是有充分的理由?

更新: 由于在有 ANSI 代码和宽字符时不能依赖 printf 来对齐数据,是否有在 ruby​​ 控制台中排列彩色表格数据的最佳实践方法?

最佳答案

我不同意你对“绿色绿色后的 9 个空间”的描述。我使用 Perl 而不是 Ruby,但是如果我修改您的语句,在字符串后打印管道符号,我会得到:

perl -e 'printf "%20s|\n%20s|\n", "\033[32mGreen\033[0m", "Green";'
Green|
Green|

这向我表明 printf() 语句计算了字符串中的 14 个字符,因此它在前面添加了 6 个空格以生成 20 个右对齐的字符。然而,终端吞下了其中的 9 个字符,将它们解释为颜色变化。因此,输出看起来比您希望的要短 9 个字符。但是, printf()在第一个“绿色”之后没有打印9个空格。

关于对齐输出(带着色)的最佳实践,我认为您需要让每个大小和对齐的字段都被处理着色的简单 '%s' 字段包围:
printf "%s%20.20s%s|%s%-10d%s|%s%12.12s%s|\n",
co_green, column_1_data, co_plain,
co_blue, column_2_data, co_plain,
co_red, column_3_data, co_plain;

很明显, co_XXXX 变量(常量?)包含切换到命名颜色的转义序列(并且 co_plain 可能比 co_black 更好)。如果事实证明您不需要对某些字段进行着色,则可以使用空字符串代替 co_XXXX 变量(或将其称为 co_empty )。

关于terminal - 如何阻止 ANSI 颜色代码弄乱 printf 对齐?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3723429/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com