2013-08-01 14 views
53

Ich habe ein Skript, das Farben erzeugt und ich muss es loswerden.Entfernen von Farben aus der Ausgabe

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript 

Der Ausgang ist (in Log-Datei):

java (pid 12321) is [email protected][60G[@[0;32m OK @[0;39m] 

Ich wusste nicht, wie die ESC-Zeichen hier setzen, so dass ich @ an seinem Platz.

änderte ich das Skript in:

#!/bin/bash 

exec > >(tee log) # redirect the output to a file but keep it on stdout 
exec 2>&1 

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

Aber jetzt gibt es mir (in Log-Datei):

java (pid 12321) is [email protected][60G[ OK ] 

Wie kann ich entfernen auch diese '@[60G?

Vielleicht gibt es eine Möglichkeit, Farbgebung für das gesamte Skript vollständig zu deaktivieren?

Antwort

76

According to Wikipedia, der alles weiß, die [m|K] im sed Befehl Sie verwenden ist speziell zu behandeln m (die Farbe Befehl) und K (die „löschen Teil der Zeile“ Befehl) ausgelegt. Ihr Skript versucht, die absolute Cursorposition auf 60 (^[[60G) zu setzen, um alle OKs in einer Zeile zu erhalten, die von Ihrer sed Zeile nicht abgedeckt wird.

(Richtig, sollte [m|K] wahrscheinlich (m|K) oder [mK], sein, weil Sie kein Pipe-Zeichen übereinstimmen. Aber das ist nicht wichtig, gerade jetzt. Versuch)

Wenn Sie schalten das Endspiel in Ihrem Befehl zu [mGK] oder (m|G|K), sollten Sie in der Lage sein, diese zusätzliche Kontrollsequenz zu fangen.

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" 
+12

BSD/OSX Benutzer: Wir haben normalerweise nicht die Option -r auf sed. 'brew install gnu-sed' installiert eine fähige Version. Lauf mit 'gsed'. –

+0

Wenn ich "Echo" $ (tput setaf 1) foo $ (tput sgr0) bar "| sed -r "s/\ x1B \ [([0-9] {1,2} (; [0-9] {1,2})?)? [mGK] // g" | cat -A ', bekomme ich: 'foo^O bar $' Also ich denke, einige Zeichen werden nicht korrekt entfernt, oder? Weißt du, wie man korrigiert? – edi9999

+1

@ edi9999 Soweit ich das beurteilen kann, besteht der Unterschied darin, dass Farbeinstellungen jenseits von 16 Farben (wie 'setaf' unterstützt) mehr Parameter als nur zwei erfordern; Meine Regex unterstützt zwei. Das Ändern des ersten '?' Out für '*' sollte helfen. Die Handhabung von 'sgr0' ist möglich, aber basierend auf einer Suche wird es wahrscheinlich außerhalb des Bereichs dieser Hacky-Regex-basierten Antwort liegen. –

10

Hmm, nicht sicher, ob dies für Sie arbeiten, aber 'tr' wird 'Streifen' (löschen) Steuercodes - versuchen:

./somescript | tr -d '[:cntrl:]' 
+10

Plötzlich ist es auch neue Zeilen entfernen – ruX

+0

Ja, LF und CR (Codes) sind Steuercodes; Wenn Sie an mehr als einer Linie interessiert sind, ist dies möglicherweise keine Lösung. Da es so aussieht, als ob Sie ein JAVA-Programm ausführen, errate ich, dass die Farben von dort verwaltet werden; Ansonsten müsstest du dir dein Konsolensetup ansehen (zB Terminaleinstellungen/Farbschema) und/oder die Optionen für jeden Befehl, der 'Farben' unterstützt, dh ls --color = nie –

+0

Ich mag diese Antwort für ihre Eleganz, sogar wenn es mehr tut, als nur Farben zu entfernen. Vielen Dank! –

5

Ich hatte auch das Problem, dass manchmal , der SI-Charakter erschien.

Es geschah zum Beispiel mit diesem Eingang: echo "$(tput setaf 1)foo$(tput sgr0) bar"

Hier ist eine Art und Weise auch die SI Charakter abzustreifen (Verschiebung in) (0x0f)

./somescript | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" | sed "s/\x0f//g" 
+0

Nicht sicher, warum diese Antwort so wenig Kredit erhält. Dies ist der einzige, der für mich arbeitet ... – m8mble

3

@ jeff-Bowmans Lösung half mir loszuwerden Einige der Farbcodes. fügte ich noch einen kleinen Teil zu den Regex, um etwas mehr zu entfernen:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # Original. Removed Red ([31;40m[1m[error][0m) 
sed -r "s/\x1B\[([0-9];)?([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" # With an addition, removed yellow and green ([1;33;40m[1m[warning][0m and [1;32;40m[1m[ok][0m) 
       ^^^^^^^^^ 
       remove Yellow and Green (and maybe more colors) 
-5

Dies funktioniert für mich:

./somescript | cat 
+1

Das hängt davon ab, wie 'somescript' implementiert ist. Es kann oder kann nicht erkennen, dass seine Standardausgabe ein tty ist. (Die Wörter Straftäter tatsächlich Terminal-spezifischen Code-Codes in das Programm hart-Code, und schrecklich brechen, wenn auf anderen Terminals oder in Skripten verwendet). –

+0

Danke Toby. Ich habe djangos manage.py zum Testen verwendet, aber was du gesagt hast, ergibt Sinn. – spiderlama

5

ich nicht anständige Ergebnisse aus einer der anderen Antworten bekommen konnte, aber folgendes für mich gearbeitet:

somescript | sed -r "s/[[:cntrl:]]\[[0-9]{1,3}m//g" 

Wenn ich nur die Steuerung char „^ [“ entfernt, es den Rest der Farbdaten links, zB „33m“. Einschließlich der Farbcode und "m" hat den Trick gemacht. Ich bin verwirrt mit s/\ x1B // g funktioniert nicht, weil \ x1B [31m sicherlich mit echo arbeitet.

+1

Verwenden Sie auf OSX (BSD sed) '-E' anstelle von' -r' für erweiterten Regex. Mehr könnte gefunden werden [hier] (https://unix.stackexchange.com/a/131940) – Assambar

Verwandte Themen