Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 如何从变量中剥离ANSI转义序列?_Bash_Colors_Terminal - Fatal编程技术网

Bash 如何从变量中剥离ANSI转义序列?

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进行

奇怪的问题。当我在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/}"
}
见: