sed - Finden Sie die richtige Farbsequenz für ANSI-erweiterte 256 Farben

sed - Finden Sie die richtige Farbsequenz für ANSI-erweiterte 256 Farben

Ich verwende derzeit den folgenden Befehl, um die Standard-ANSI-Farben mit dem Tail-Befehl zu verwenden:

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

Dies ist ein leuchtendes Gelb, ich beschäftige mich jedoch gerade mit erweiterten 256 Farben in Bash und würde gerne die Farbe Orange verwenden. Ich habe das richtige Farbnummerierungsschema für Vordergrund und Hintergrund gefunden, um Orange auf Schwarz zu erhalten.

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

Ich habe jedoch Probleme, dies in einen Sed-Befehl zu übersetzen, den ich mit dem Tail-Befehl verwenden kann.

Ich habe Folgendes versucht:

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

Aber dann bleibt alles weiß. Ich habe versucht:

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

Dadurch werden jedoch die Zeilen, die die Zeichenfolge „MAJOR“ enthalten, schwarz. Ich habe auch versucht, das Hintergrundschema wegzulassen und nur das Orange zu verwenden:

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

Dies scheint aber auch die Zeilen zu schwärzen, die das Wort „MAJOR“ enthalten. Weiß jemand, was die richtige ANSI-Sequenz wäre, damit sed mir Orange auf Schwarz gibt? Zu Ihrer Information: Der sed-Befehl, den ich in meinem ersten Beispiel verwendet habe, druckt die gesamte Zeile in der gewählten Farbe und ich würde dasselbe Verhalten mit der neuen Farbsequenz benötigen, nicht nur das Einfärben des Wortes selbst.

AKTUALISIEREN:

Das funktioniert:

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

Aber es bleiben andere Zeilen übrig, die kein MINOR-Magenta enthalten. Wie kann ich diese standardmäßig wieder auf Weiß zurücksetzen? Schalte ich etwas nicht richtig aus? Es macht die Standardschriftfarbe für die gesamte Shell tatsächlich zu Magenta, wie ich sehen kann, wenn ich den Tail-Befehl beende.

Antwort1

Es gibt mehr als ein Problem, das deutlich wird, wenn man aus Ihren Beispielen ein Skript erstellt:

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

was erzeugt ( ^[ist Flucht):

^[[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

In der ersten Zeile ^[[93mist „a“ das 16-Farben-Escapezeichen von aixterm, um einen gelben Text festzulegen und ^39mden Text auf die Standardfarben des Terminals zurückzusetzen.

Die zweite Zeile hat Probleme mit einer nicht beendeten Escape-Sequenz (die damit beginnt, den Hintergrund auf Schwarz=40, Blinken=5, 95=heller magentafarbener Text zu setzen, dann versuchen 38 und 5, eine 256-Farben-Sequenz einzuführen – die nicht beendet wird).

Die dritte Zeile ist eine leichte Variation der zweiten.

Das Hauptproblem besteht darin, dass Ihr sedkein Escape-Zeichen ausgibt, es sei denn, Sie drücken es so aus \o033(was Sietatan einigen Stellen tun).

Zweitens beenden Sie die Escapezeichen nicht richtig. Das letzte mZeichen ist Teil der Sequenz. Wenn das letzte Zeichen fehlt, kann die gesamte Sequenz verworfen werden. Lesen Sie am besten die Dokumentation:XTerm-Steuersequenzen.

Übrigens,ANSIhabe nie etwas über 8 Farben hinaus dokumentiert, daher ist es weniger verwirrend, sich auf die Sequenzen anhand der ursprünglichen Implementierung zu beziehen (aixterm für 16 Farben, xterm für 256 Farben).

Wenn Sie einfach ganze Zeilen mitWESENTLICHorange hervorgehoben werden soll, dann hätten Sie (basierend auf den Kommentaren) Folgendes tun können:

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

5Der Code wird jedoch nicht so umfassend unterstützt wie die 2Verwendung von R/G/B, etwa so:

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

(die 128er sind nur ein erster Versuch – Ihre Geschmäcker können unterschiedlich sein).

Weiterführende Literatur:

CSI Pm m Character Attributes (SGR).

Antwort2

Sie suchen wahrscheinlich danach:

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

obwohl es vereinfacht werden kann mit

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

Beachten Sie die Änderung von 40, 48was bedeutet, dass wir die Hintergrundfarbe ändern möchten.

Wenn Sie Schwarz als Hintergrundfarbe wünschen:

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

und wenn die Hintergrundfarbe bereits schwarz ist, müssen Sie sie überhaupt nicht ändern:

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

verwandte Informationen