簡體   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