奇怪的问题。当我在Bash中设置变量以显示为某种颜色时,我不知道如何重置它。这是一个例子:
首先定义颜色代码:
YELLOW=$(tput setaf 3)
RESET=$(tput sgr0)
现在设置错误消息变量和颜色部分。
ERROR="File not found: "$YELLOW"Length.db$RESET"
这将变量ERROR设置为从最终将在终端上显示的函数返回的错误消息。除文件名外,错误全部为白色。文件名以黄色突出显示给用户。
除非使用rsyslog进行日志记录,否则此方法很有效。当记录错误消息时,它会出现如下:
找不到档案:#033 [33mLength.db#033(B#033 [m
这显然使得日志文件非常难以阅读。起初我想我可以在输出到终端之后但在登录之前立即使用sed错误消息进行处理,但是没有什么可以搜索和替换。也就是说,我以为我可以用sed做类似的事情:
ERROR=$(echo "$ERROR" | sed -r 's%\#033\[33m%%')
但是当你回显变量时,这些字符不存在(这是有意义的,因为你没有在终端上看到它)。所以我卡住了。设置后我不知道如何重置变量的颜色。我还尝试使用$ RESET以某种方式反转该过程,但也许我的语法错误或其他。
答案 0 :(得分:3)
你几乎拥有它。试试这个:
ERROR=$(echo "$ERROR" | sed 's%\o033\[33m%%g')
但请注意,在\oNNN
中使用sed
转义序列是GNU扩展,因此不符合POSIX。如果这是一个问题,你应该能够做更多的事情:
ERROR=$(echo "$ERROR" | sed 's%'$(echo -en "\033")'\[33m%%g')
显然,这只适用于这一种特定颜色(黄色),并且用于删除任何转义序列的正则表达式(例如其他颜色,背景颜色,光标定位等)将是{ {3}}
另请注意,-r
不是必需的,因为这里没有使用扩展正则表达式语法。我猜你已经知道了,并且你刚刚将-r
排除在习惯之外,但为了清楚起见,我还是提到了它。
答案 1 :(得分:0)
这是一个纯Bash解决方案:
ERROR="${ERROR//$'\e'\[*([0-9;])m/}"
使其具有功能:
# Strips ANSI codes from text
# 1: The text
# >: The ANSI stripped text
function strip_ansi() {
echo -n "${1//$'\e'\[*([0-9;])m/}"
}
请参阅: