如何从变量中删除ANSI转义序列?

时间:2014-05-01 20:44:02

标签: bash colors terminal

奇怪的问题。当我在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以某种方式反转该过程,但也许我的语法错误或其他。

2 个答案:

答案 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/}"
}

请参阅: