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/'

しかし、MINOR 色のマゼンタを含まない他の行はそのまま残ります。これらの行をデフォルトの白に戻すにはどうすればよいですか。何かを正しくオフにしていないのでしょうか? 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テキストを端末のデフォルトの色にリセットします。

2 行目には、終了していないエスケープ シーケンスに関する問題があります (背景を black=40、blink=5、95=明るいマゼンタ テキストに設定することから始まり、次に 38 と 5 で 256 色のシーケンスを導入しようとしますが、これは終了していません)。

3 行目は 2 行目を少し変えたものです。

主な問題は、sed次のように表現しない限り、エスケープ文字を出力しないことです\o033したいくつかの場所で行います。

2 番目に、エスケープが適切に終了していません。最後の文字はmシーケンスの一部です。最後の文字が欠落している場合は、シーケンス全体を破棄できます。ドキュメントを読むことをお勧めします。XTerm 制御シーケンス

ところで、ANSI8 色を超える色については文書化されていないため、元の実装 (16 色の​​場合は aixterm、256 色の場合は xterm) によるシーケンスを参照する方が混乱が少なくなります。

単に行全体を選考科目オレンジ色で強調表示したい場合は、(コメントに基づいて)次のようにします。

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

ただし、この5コードは R/G/B を使用するコードほど広くサポートされていません2。次のようになります。

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/'

関連情報