Verwenden von sed zum Färben der Ausgabe eines Befehls unter Solaris

29

Ich habe ein ksh-Skript, das sowohl unter Linux als auch unter Solaris funktionieren muss. Ich versuche, die Ausgabe bestimmter Befehle einzufärben. Es funktioniert unter Linux (speziell RHEL6), aber nicht unter Solaris (SunOS 5.10).

Befehl unter Linux (die Ausgabe "test" ist richtig rot gefärbt):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
test

Befehl auf Solaris (die Ausgabe "Test" ist nicht gefärbt):

[amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,'
x1B[31mtestx1B[0m

Gibt es eine Möglichkeit, diesen Befehl so zu gestalten, dass die Ausgabe rot ist, ohne die Rohcodes in der Ausgabe? Ich kann den Befehl 'echo' nicht ändern, da dies nur die Eingabe des Befehls ist, den ich gerade ausführe.

acm
quelle

Antworten:

35

\xNN ist eine Escape-Sequenz in GNU sed, aber keine Standardsequenz und insbesondere unter Solaris nicht verfügbar.

Sie können ein buchstäbliches Escape-Zeichen in Ihr Skript einfügen, dies würde jedoch das Lesen und Bearbeiten erschweren.

Sie können verwenden printf, um ein Escape-Zeichen zu generieren. Es versteht oktale Fluchten, nicht hexadezimal.

esc=$(printf '\033')
echo "test" | sed "s,.*,${esc}[31m&${esc}[0m,"

Sie können anrufen tput, um den Ersetzungstext im Aufruf von sed zu generieren. Dieser Befehl sucht nach Escape-Sequenzen in der terminfo- Datenbank. Theoretisch tputmacht das Verwenden von Ihr Skript portabler, aber in der Praxis ist es unwahrscheinlich, dass Sie auf ein Terminal stoßen, das keine ANSI-Escape-Codes verwendet .

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Gilles 'SO - hör auf böse zu sein'
quelle
Das funktioniert gut, um auf einem cat |sedzu thx einzufärben!
Aquarius Power
8

Es wäre einfacher zu bedienen tput

tput setaf 1; somecommand; tput sgr0

oder

tput setaf 1
somecommand
tput sgr0

Dadurch wird der Vordergrund auf Rot gesetzt. somecommandAnschließend wird die Ausgabe in Rot angezeigt und die Farbsequenz gelöscht. Das funktioniert zumindest mit bash, zshund ksh.

Siehe tmux(1)und terminfo(5)für weitere Informationen darüber, was Sie damit machen können tput.

Bahamat
quelle
Danke für die Antwort. Wie ich bereits sagte, kann ich den Echobefehl nicht ändern. 'Echo' ist nur ein Ersatz für den Prozess, den ich anrufe und den ich nicht ändern kann. Kann man sed mit tput irgendwie benutzen? Wenn ich diesen Befehl unter sunOS 5.10 ausführe, werden keine Farben angezeigt.
Am
Ich habe es aktualisiert, um es in separate Befehle aufzuteilen.
Bahamat
Dies ist insofern besser als meine derzeitige Implementierung, als sie keine rohen ASCII-Codes auf Solaris druckt. Jedoch (aus welchem ​​Grund auch immer) färbt es die Ausgabe von 'somecommand' auf Solaris nicht. Es funktioniert unter Linux. Ich habe @ Gilles Antwort akzeptiert, was beides tut. Vielen Dank.
21.08.12
0

Bei einigen Terminals (wie z. B. Bash in Iterm für mich) können Sie die Tasten "Strg-V" gefolgt von "Strg + [" drücken, und das Escape-Zeichen wird in die Eingabezeichenfolge eingefügt. Wenn es funktioniert, werden Sie wahrscheinlich die Zeichen "^ [" auf dem Bildschirm sehen, aber wenn Sie den Cursor darüber bewegen, wird es als ein Zeichen behandelt, da es sich wirklich hinter den Kulissen befindet.

Um zu verstehen, was passiert (und um zu testen, ob dies möglich ist), können Sie Strg + v gefolgt von Strg + i eingeben. Sie sollten sehen, dass das Tabulatorzeichen in Ihre Eingabeaufforderungszeichenfolge eingefügt wurde. Es gibt CS Geschichte, warum dies der Fall ist : aber es stellt sich heraus , dass wirklich alte Tastatur ctrl hatte + ich hart verdrahtet das Tab - Zeichen zu senden; und die Tabulatortaste senden dasselbe elektrische Signal.

Aus diesem Grund interpretiert Bash für viele Terminals immer noch bestimmte Strg-Codes, um sie denselben Zeichen zuzuordnen.

Strg + I ist einem Tabulatorzeichen zugeordnet, und Strg + [stimmt zufällig mit dem ASCII-Escapezeichen überein.

Alexander Bird
quelle