繁体   English   中英

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

[英]How to strip ANSI escape sequences from a variable?

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

你几乎拥有它。 试试这个:

ERROR=$(echo "$ERROR" | sed 's%\o033\[33m%%g')

但是请注意,在sed使用\\oNNN转义序列是 GNU 扩展,因此不符合 POSIX。 如果这是一个问题,您应该能够执行以下操作:

ERROR=$(echo "$ERROR" | sed 's%'$(echo -en "\033")'\[33m%%g')

显然,这仅适用于这种特定颜色(黄色),而删除任何转义序列(例如其他颜色、背景颜色、光标定位等)的正则表达式会稍微复杂一些

还要注意-r不是必需的,因为这里没有使用扩展的正则表达式语法。 我猜您已经知道这一点,并且您只是出于习惯将-r包含在内,但为了清楚起见,我还是提到了它。

这是一个纯 Bash 解决方案:

ERROR="${ERROR//$'\e'\[*([0-9;])m/}"

使它成为一个函数:

# Strips ANSI codes from text
# 1: The text
# >: The ANSI stripped text
function strip_ansi() {
  shopt -s extglob # function uses extended globbing
  printf %s "${1//$'\e'\[*([0-9;])m/}"
}

看:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM