sed - 找出 ANSI 擴展 256 色的正確色彩序列

sed - 找出 ANSI 擴展 256 色的正確色彩序列

我目前正在使用以下命令透過 tail 命令使用標準 ANSI 顏色:

tail -f syslogfile | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'

這是亮黃色,但我剛剛在 bash 中使用擴展的 256 種顏色,我想使用橙色。我找到了正確的前景和背景顏色編號方案,使我在黑色上呈現橙色。

echo -e "\\033[40;5;95;38;5;202mhello world\\033[0m"

但是,我無法將其轉換為可以與 tail 命令一起使用的 sed 命令。

我已經嘗試過這個:

sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'

但這讓一切都變成白色。我努力了:

sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'

但這會使包含字串“MAJOR”的行變黑。我也嘗試省略背景方案並只使用橙色:

sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

但這似乎也將包含“MAJOR”一詞的行塗黑了 有誰知道 sed 給我黑色背景上的橙色的正確 ANSI 序列是什麼?僅供參考,我在第一個範例中使用的 sed 命令以所選顏色列印整行,我需要使用新顏色序列進行相同的行為,而不僅僅是為單字本身著色。

更新:

這有效:

sed -e 's/\(.*MINOR.*\)/\o033[38;5;202m\1\o033[40;5;95m/'

但留下不包含次要洋紅色的其他線條。我如何讓它們預設回到白色。我是否沒有正確關閉某些東西?它實際上為整個 shell 洋紅色設定了預設字體顏色,正如我終止 tail 命令時所看到的那樣。

答案1

透過編寫範例腳本可以看到不只一個問題:

#!/bin/sh
MSG="this is MAJOR stuff"
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[93m\1\o033[39m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[40;5;95;38;5;202\033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\o033[40;5;95;38;5;202\o033[0m/'
echo "$MSG" | sed -e 's/\(.*MAJOR.*\)/\033[38;5;202\033[0m/'

產生(^[是轉義):

^[[93mthis is MAJOR stuff^[[39m
this is MAJOR stuff33[40;5;95;38;5;202this is MAJOR stuff33[0m
^[[40;5;95;38;5;202^[[0m
this is MAJOR stuff33[38;5;202this is MAJOR stuff33[0m

在第一行中,a^[[93m是 aixterm 16 色轉義,用於設定黃色文本,並將^39m文字重設為終端的預設顏色。

第二行有未終止轉義序列的問題(開始將背景設為黑色 = 40、閃爍 = 5、95 = 明亮的洋紅色文本,然後 38 和 5 嘗試引入 256 色序列 - 未終止) 。

第三行與第二行略有不同。

主要問題是你sed不會發出轉義字符,除非你將其表達為\o033(你做過在幾個地方做)。

其次,你沒有正確結束越獄。決賽m是這個序列的一部分。當最後一個字元遺失時,整個序列可以被丟棄。最好閱讀文件:XTerm 控制序列

順便一提,美國國家標準學會從未記錄過超過 8 種顏色的任何內容,因此透過原始實作(aixterm 表示 16 色,xterm 表示 256 色)引用序列不會那麼混亂。

如果你只是想要整行主要的以橙色突出顯示,然後(根據評論),您可以這樣做:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;5;95m\1\o033[m/'

然而,該5程式碼的支援不如2使用 R/G/B 的廣泛,如下所示:

sed -e 's/^\(.*MAJOR.*\)$/\o033[48;2;128;128;0m\1\o033[m/'

(128 只是第一次嘗試 - 您的口味可能會有所不同)。

延伸閱讀:

CSI Pm m Character Attributes (SGR).

答案2

您可能正在尋找這個:

sed -e 's/\(.*MAJOR.*\)/\o033[48;5;95;38;5;202m\1\o033[0m/'

雖然它可以簡化為

sed -e 's/.*MAJOR.*/\o033[48;5;95;38;5;202m&\o033[m/'

請注意 的變更40意味著48我們要更改背景顏色。

如果你想要背景顏色為黑色:

sed -e 's/.*MAJOR.*/\o033[40;38;5;202m&\o033[m/'

如果背景顏色已經是黑色,則根本不需要更改它:

sed -e 's/.*MAJOR.*/\o033[38;5;202m&\o033[m/'

相關內容