【问题标题】:How to strip ANSI escape sequences from a variable?如何从变量中去除 ANSI 转义序列?
【发布时间】:2014-06-18 10:30:26
【问题描述】:

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

【问题讨论】:

    标签: bash colors terminal


    【解决方案1】:

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

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

    但是请注意,sed\oNNN 转义序列的使用是 GNU 扩展,因此不符合 POSIX。如果这是一个问题,您应该能够做更多类似的事情:

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

    显然,这仅适用于这一种特定颜色(黄色),而用于删除 any 转义序列(例如其他颜色、背景颜色、光标定位等)的正则表达式将是 @ 987654321@.

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

    【讨论】:

      【解决方案2】:

      这是一个纯 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/}"
      }
      

      见:

      【讨论】:

        猜你喜欢
        • 2021-02-25
        • 2013-01-19
        • 1970-01-01
        • 2012-04-14
        • 2011-06-18
        相关资源
        最近更新 更多