[英]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.