Bash 如何从变量中剥离ANSI转义序列?
奇怪的问题。当我在Bash中将一个变量设置为显示为特定颜色时,我不知道如何重置它。以下是一个例子: 首先定义颜色代码:Bash 如何从变量中剥离ANSI转义序列?,bash,colors,terminal,Bash,Colors,Terminal,奇怪的问题。当我在Bash中将一个变量设置为显示为特定颜色时,我不知道如何重置它。以下是一个例子: 首先定义颜色代码: YELLOW=$(tput setaf 3) RESET=$(tput sgr0) 现在设置错误消息变量和颜色部分 ERROR="File not found: "$YELLOW"Length.db$RESET" 这将变量ERROR设置为从最终将显示在终端上的函数返回的错误消息。除文件名外,错误将全部为白色。对于用户,文件名以黄色突出显示 除了使用rsyslog进行
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/}"
}
见: