Ich habe ein Skript, das eine Ausgabe mit Farben erzeugt, und ich muss die ANSI-Codes entfernen.
#!/bin/bash
exec > >(tee log) # redirect the output to a file but keep it on stdout
exec 2>&1
./somescript
Die Ausgabe ist (in Protokolldatei):
java (pid 12321) is running...@[60G[@[0;32m OK @[0;39m]
Ich wusste nicht, wie ich den ESC-Charakter hier einfügen sollte, also habe ich ihn @
an seine Stelle gesetzt.
Ich habe das Skript geändert 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 Protokolldatei):
java (pid 12321) is running...@[60G[ OK ]
Wie kann ich das auch entfernen @[60G
?
Vielleicht gibt es eine Möglichkeit, die Farbgebung für das gesamte Skript vollständig zu deaktivieren?
strip-ansi
: github.com/chalk/strip-ansi .Antworten:
Laut Wikipedia , die
[m|K]
in demsed
ist Befehl Sie verwenden speziell Griff entworfenm
(die Farbe Befehl) undK
(der „Lösch Teil der Zeile“ Befehl). Ihr Skript versucht, die absolute Cursorposition auf 60 (^[[60G
) zu setzen, um alle OKs in einer Zeile zu erhalten, die Ihresed
Zeile nicht abdeckt.(Richtig
[m|K]
sollte es wahrscheinlich sein(m|K)
oder[mK]
, weil Sie nicht versuchen, einem Pipe-Charakter zu entsprechen. Aber das ist momentan nicht wichtig.)Wenn Sie diese letzte Übereinstimmung in Ihrem Befehl auf
[mGK]
oder umschalten,(m|G|K)
sollten Sie in der Lage sein, diese zusätzliche Kontrollsequenz zu erfassen.quelle
brew install gnu-sed
installiert eine fähige Version. Laufen Sie mitgsed
.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$
Ich denke, einige Zeichen werden nicht richtig entfernt, oder? Wissen Sie, wie man korrigiert?setaf
Unterstützung) mehr Parameter als nur zwei erfordern. Mein Regex unterstützt zwei. Ändern des ersten?
out für*
soll helfen. Die Handhabungsgr0
ist möglich, aber basierend auf einer Suche wächst sie wahrscheinlich außerhalb des Rahmens dieser auf Hacky Regex basierenden Antwort.sed
der Pipe ein hinzufügt , um das "Shift-in" -Zeichen zu[38;5;45m
). Diese alternative Antwort funktioniert unix.stackexchange.com/a/55547/168277Ich konnte mit keiner der anderen Antworten anständige Ergebnisse erzielen, aber Folgendes funktionierte für mich:
Wenn ich nur das Steuerzeichen "^ [" entfernt habe, sind die restlichen Farbdaten übrig geblieben, z. B. "33m". Das Einfügen des Farbcodes und "m" hat den Trick gemacht. Ich bin verwirrt mit s / \ x1B // g funktioniert nicht, weil \ x1B [31m sicherlich mit Echo funktioniert.
quelle
-E
anstelle von-r
für erweiterten Regex. Weitere können hier gefunden werden{1,3}
um{,3}
(sonst war es noch einige Kontrollen Skipping), Dank für Ihre Lösung!sed -r "s/[[:cntrl:]]\[([0-9]{1,3};)*[0-9]{1,3}m//g"
IMHO versuchen die meisten dieser Antworten zu sehr, den Inhalt des Escape-Codes einzuschränken. Infolgedessen fehlen ihnen häufig verwendete Codes wie
[38;5;60m
(Vordergrund-ANSI-Farbe 60 aus dem 256-Farben-Modus).Sie erfordern auch die
-r
Option, die GNU-Erweiterungen aktiviert . Diese sind nicht erforderlich; Sie lassen den regulären Ausdruck nur besser lesen.Hier ist eine einfachere Antwort, die die 256-Farben-Escapezeichen behandelt und auf Systemen mit Nicht-GNU funktioniert
sed
:Dies fängt alles auf, was mit beginnt
[
, eine beliebige Anzahl von Dezimalstellen und Semikolons hat und mit einem Buchstaben endet. Dies sollte eine der gängigen ANSI-Escape-Sequenzen abfangen .Für Funsies ist hier eine größere und allgemeinere (aber minimal getestete) Lösung für alle denkbaren ANSI-Escape-Sequenzen :
(und wenn Sie das SI-Problem von @ edi9999 haben, fügen Sie
| sed "s/\x0f//g"
es am Ende hinzu; dies funktioniert für jedes Steuerzeichen, indem Sie es0f
durch das Hex des unerwünschten Zeichens ersetzen. )quelle
|
in sed,]
innerhalb einer Zeichenklasse in sed und'
in einer einfach zitierten Bash-Zeichenfolge. Es funktioniert jetzt für mich für einen sehr einfachen Testfall.Für Mac OSX oder BSD verwenden
quelle
-E
Flag für sed zu übergeben, um den erweiterten regulären Ausdruck zu aktivieren.Ich hatte auch das Problem, dass manchmal das SI-Zeichen auftauchte.
Es ist zum Beispiel mit dieser Eingabe passiert:
echo "$(tput setaf 1)foo$(tput sgr0) bar"
Hier ist eine Möglichkeit, auch das SI-Zeichen (Shift In) (0x0f) zu entfernen.
quelle
Hmm, ich bin mir nicht sicher, ob dies für Sie funktioniert, aber 'tr' entfernt (löscht) Steuercodes - versuchen Sie:
quelle
rwxr-xr-x 1 tokra admin 22 Oct 18 14:21 [0m[01;36m/usr/local/opt/gradle[0m -> [01;34m../Cellar/gradle/4.2.1[0m/
Ich hatte ein ähnliches Problem. Alle Lösungen, die ich gefunden habe, funktionierten gut für die Farbcodes, entfernten jedoch nicht die von hinzugefügten Zeichen
"$(tput sgr0)"
(Zurücksetzen von Attributen) .Nehmen wir zum Beispiel die Lösung im Kommentar von Davemyron, die Länge der resultierenden Zeichenfolge im folgenden Beispiel beträgt 9, nicht 6:
Um richtig zu funktionieren, musste der Regex erweitert werden, um auch der von hinzugefügten Sequenz zu entsprechen
sgr0
("\E(B
") :quelle
Viel einfachere Funktion in reinem Bash zum Herausfiltern gängiger ANSI-Codes aus einem Textstrom:
Sehen:
quelle
tldr
. (Obwohl ich zsh benutze, könnte es auch daran liegen.)extglob
oder wahrscheinlich auch nicht das Ersetzen von Strings insgesamt.sed
hier genannten alternativen Methoden verwenden , die mit Zsh funktionieren.Die Lösung von @ jeff-bowman hat mir geholfen, einige der Farbcodes loszuwerden. Ich habe der Regex eine weitere kleine Portion hinzugefügt, um weitere zu entfernen:
quelle
Hier ist eine reine Bash-Lösung.
Speichern unter
strip-escape-codes.sh
, ausführbar machen und dann ausführen<command-producing-colorful-output> | ./strip-escape-codes.sh
.Beachten Sie, dass dadurch alle ANSI-Escape-Codes / Sequenzen entfernt werden. Wenn Sie nur Farben entfernen möchten, ersetzen Sie diese
[a-zA-Z]
durch"m"
.Bash> = 4.0:
Bash <4.0:
quelle
Die umstrittene Idee wäre, die Terminaleinstellungen für diese Prozessumgebung neu zu konfigurieren, um den Prozess darüber zu informieren, dass das Terminal keine Farben unterstützt.
Mir
TERM=xterm-mono ./somescript
fällt so etwas ein. YMMV mit Ihrem spezifischen Betriebssystem und der Fähigkeit Ihres Skripts, die Farbeinstellungen des Terminals zu verstehen.quelle
Das funktioniert bei mir:
quelle
somescript
es umgesetzt wird. Es kann oder kann nicht erkennen, dass seine Standardausgabe ein tty ist. (Die Wörter Täter codieren tatsächlich terminalspezifische Escape-Codes fest in das Programm und brechen schrecklich, wenn sie auf anderen Terminals oder in Skripten verwendet werden.)