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

ただし、補助マゼンタ色を含まない他の行はそのまま残します。どうすればデフォルト値を白に戻すことができますか?私は何かを正しく閉じていませんか? tailコマンドを終了すると、実際にはシェル全体のデフォルトのフォント色をフクシアに設定します。

ベストアンサー1

サンプルスクリプトを作成すると、2つ以上の問題を見ることができます。

#!/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テキストを黄色に設定し、^39mテキストを端末のデフォルトの色にリセットするaixterm 16色エスケープです。

2行目には、終了していないエスケープシーケンスに問題があります(背景を黒= 40、フラッシュ= 5、95 =明るいマゼンタテキストに設定し、38および5で終了しない256色シーケンスを導入しようとしました)。

3番目の行は2番目の行とは若干異なります。

主な問題は、次sedのように表現しない限り、エスケープ文字をエクスポートしないことです。\o033したいろんなところでやってください)

第二に、脱獄を正しく終了しませんでした。決勝戦はmこのシーケンスの一部です。最後の文字が失われると、シーケンス全体が削除される可能性があります。文書を読むのが最善です。XTerm制御シーケンス

さて、米国国立標準協会8つ以上の色を含む項目は文書化されていないため、元の実装(16色の場合はaixterm、256色の場合はxterm)を介してシーケンスを参照するのはあまり混乱しません。

行全体が必要な場合基本オレンジ色で強調表示されている場合(説明に従って)、次のことができます。

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

ただし、このコードは、以下のようにR / G / Bを使用するのと同じくらい広くサポートされ5ていません。2

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

(128一度だけ試してください。好みが異なる場合があります。)

追加資料:

CSI Pm m Character Attributes (SGR).

おすすめ記事