如何测试程序的输出是否包含颜色(代码)?

如何测试程序的输出是否包含颜色(代码)?

我正在开发的程序有一个选项可以在其输出中启用/禁用颜色代码。

我想测试一下这个功能是否按预期工作。这是我尝试过的:

$ myprogram | grep -q '\e[32m' # testing for green color
$ myprogram | grep -q '\e'
$ myprogram | grep -q '\033'

我还尝试了带有双反斜杠且不带引号的相同命令。

但这些都不起作用。

如何测试我的程序输出是否包含任何颜色代码?

答案1

grep命令及其 BRE 和 ERE 变体无法识别代表 ESC 的序列。您需要使用 perl 扩展 (GNU grep -P) 或匹配固定的 shell 字符串。

# string with shell formatting, grep uses fixed string match
( tput setaf 2; echo Green text; tput op ) | grep -Fq $'\033[32' && echo found green
found green

# grep uses Perl's PCRE match to match any colour (change "\d+" to "32" for just green)
( tput setaf 2; echo Green text; tput op ) | grep -Pq '\033\[\d+[;m]' && echo found a colour
found a colour

如果您的 shell 支持$'...string here...'字符串格式,并且您只需要匹配特定颜色,我建议您选择该选项。

答案2

您可以做的另一件事是使用 'tr' 将转义字符转换为其他字符,特别是如果存在像 ^ 或 % 甚至 ^A (control-A) 这样的字符,则 grep似乎很满意:

boldfoo=$(printf "not bold \033[1mfoo\033[m not bold")

echo $boldfoo
echo $boldfoo | tr '\033' '\001' | grep ^V^A  # Type <Ctrl-V><Ctrl-A>
# Use the return value from this to see whether there are escape characters in $boldfoo.

我已经使用这个技巧来使用 sed/grep 来查找多行模式 - 变成 ^A,然后与 ^A 匹配模式,等等。由于整个输入现在是一行,所以需要一些花招,但它适用于一些努力。

相关内容