sed - 找到 ANSI 扩展 256 色的正确颜色序列

sed - 找到 ANSI 扩展 256 色的正确颜色序列

我当前正在使用以下命令通过 tail 命令使用标准 ANSI 颜色:

tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'

这是亮黄色,但我刚刚在 bash 中使用扩展的 256 种颜色,我想使用橙色。我找到了正确的前景和背景颜色编号方案,使我在黑色上呈现橙色。

echo -e "\\033[40;5;95;38;5;202mhello world\\033[0m"

但是,我无法将其转换为可以与 tail 命令一起使用的 sed 命令。

我已经尝试过这个:

sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'

但这让一切都变成白色。我努力了:

sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'

但这会使包含字符串“MAJOR”的行变黑。我也尝试过省略背景方案并只使用橙色:

sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

但这似乎也将包含“MAJOR”一词的行涂黑了 有谁知道 sed 给我黑色背景上的橙色的正确 ANSI 序列是什么?仅供参考,我在第一个示例中使用的 sed 命令以所选颜色打印整行,我需要使用新颜色序列进行相同的行为,而不仅仅是为单词本身着色。

更新:

这有效:

sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\1\o033[40;5;95m/'

但留下不包含次要洋红色的其他线条。我如何让它们默认回到白色。我是否没有正确关闭某些东西?它实际上为整个 shell 洋红色设置了默认字体颜色,正如我终止 tail 命令时所看到的那样。

答案1

通过编写示例脚本可以看到不止一个问题:

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

产生(^[是转义):

^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m

在第一行中,a^[[93m是 aixterm 16 色转义,用于设置黄色文本,并将^39m文本重置为终端的默认颜色。

第二行存在未终止转义序列的问题(开始将背景设置为黑色 = 40、闪烁 = 5、95 = 明亮的洋红色文本,然后 38 和 5 尝试引入 256 色序列 - 未终止) 。

第三行与第二行略有不同。

主要问题是你sed不会发出转义字符,除非你将其表达为\o033(你做过在几个地方做)。

其次,你没有正确结束越狱。决赛m是这个序列的一部分。当最后一个字符丢失时,整个序列可以被丢弃。最好阅读文档:XTerm 控制序列

顺便一提,美国国家标准协会从未记录过超过 8 种颜色的任何内容,因此通过原始实现(aixterm 表示 16 色,xterm 表示 256 色)引用序列不会那么混乱。

如果你只是想要整行主要的以橙色突出显示,然后(根据评论),您可以这样做:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\1\o033[m/'

然而,该5代码的支持不如2使用 R/G/B 的广泛,如下所示:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\1\o033[m/'

(128 只是第一次尝试 - 您的口味可能会有所不同)。

进一步阅读:

CSI Pm m Character Attributes (SGR).

答案2

您可能正在寻找这个:

sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\1\o033[0m/'

虽然它可以简化为

sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'

请注意 的更改40意味着48我们要更改背景颜色。

如果你想要背景颜色为黑色:

sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'

如果背景颜色已经是黑色,则根本不需要更改它:

sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'

相关内容