我当前正在使用以下命令通过 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 只是第一次尝试 - 您的口味可能会有所不同)。
进一步阅读:
- ECMA-48:编码字符集的控制函数
- 我可以通过颜色编号来设置颜色吗?(xterm 常见问题解答)
- XTerm 控制序列
特别是,以
答案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/'