Untersuchen der Ausgabe von
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";'
In einem Texteditor (z. B. vi
) wird Folgendes angezeigt:
^[[37mABC
^[[0m
Wie würde man die ANSI-Farbcodes aus der Ausgabedatei entfernen? Ich nehme an, der beste Weg wäre, die Ausgabe durch eine Art Stream-Editor zu leiten.
Folgendes funktioniert nicht
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' | perl -pe 's/\^\[\[37m//g' | perl -pe 's/\^\[\[0m//g'
more
oderless -R
die Escape-Codes als Farbe anstelle eines Texteditors interpretieren.Antworten:
Die Zeichen
^[[37m
und^[[0m
sind Teil der ANSI-Escape-Sequenzen (CSI-Codes) . Siehe auch diese Spezifikationen .GNU verwenden
sed
\x1b
(oder\x1B
) ist das Escape- Sonderzeichen(
sed
unterstützt keine Alternativen\e
und\033
)\[
ist das zweite Zeichen der Escape-Sequenz[0-9;]*
ist der Farbwert (die Farbwerte) für Regexm
ist das letzte Zeichen der Escape-Sequenz⚠ Unter macOS unterstützt der Standardbefehl
sed
keine Sonderzeichen, wie in den Kommentaren\e
von slm und steamer25 angegeben . Verwenden Sie stattdessen,gsed
dass Sie mit installieren könnenbrew install gnu-sed
.Beispiel mit der Befehlszeile von OP: (OP bedeutet Original Poster)
Tom Hale schlägt vor, alle anderen Escape-Sequenzen zu entfernen,
[a-zA-Z]
anstatt nur den Buchstabenm
zu verwenden, der für die Escape-Sequenz des Grafikmodus (Farbe) spezifisch ist. Aber[a-zA-Z]
kann zu breit sein und könnte zu viel entfernen. Michał Faleński und Miguel Mota schlagen vor, nur einige Escape-Sequenzen mit[mGKH]
und zu entfernen[mGKF]
. Britton Kerin weistK
darauf hin, dass zusätzlich zumm
Entfernen der Farben ausgcc
Fehler / Warnung auch verwendet werden muss (nicht vergessen, umzuleitengcc 2>&1 | sed...
).Verwenden
perl
Die
sed
auf einigen Betriebssystemen installierte Version ist möglicherweise eingeschränkt (z. B. macOS). Der Befehlperl
hat den Vorteil, dass er auf mehr Betriebssystemen im Allgemeinen einfacher zu installieren / aktualisieren ist. Adam Katz schlägt vor,\e
(dasselbe wie\x1b
) in PCRE zu verwenden .Wählen Sie Ihren regulären Ausdruck abhängig davon, wie viele Befehle Sie filtern möchten:
Beispiel mit der Kommandozeile von OP:
Verwendungszweck
Wie in Stuart Cardalls Kommentar erwähnt, wird diese
sed
Befehlszeile vom Projekt Ultimate Nginx Bad Bot (1000 Sterne) verwendet, um den E-Mail-Bericht zu bereinigen ;-)quelle
sed
Befehl und die Erklärung. :)1;31m
so besser hinzufügen ,;
um Ihre regex:cat colored.log | sed -r 's/\x1b\[[0-9;]*m//g'
oder sie werden nicht abgezogen werden.sed
mit dem gezeigten Beispiel nicht funktioniert hat, diegsed
Version jedoch.brew install gnu-sed
.Ich habe einen besseren Fluchtsequenzentferner gefunden. Überprüfen Sie dies:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
quelle
sed -r
NICHT.Was angezeigt wird,
^[
ist nicht^
und[
; Es ist das ASCII-ESC
Zeichen, das von Escoder erzeugt wird Ctrl[(die^
Notation bedeutet die Strg-Taste).ESC
ist 0x1B hexadezimal oder 033 oktal, daher müssen Sie\x1B
oder\033
in Ihren Regexes verwenden:quelle
Wenn Sie etwas Einfaches bevorzugen, können Sie das Modul strip-ansi verwenden ( Node.js erforderlich):
Dann benutze es so:
Oder geben Sie einfach eine Zeichenfolge ein:
quelle
cat
( UUOC ) - es sollte möglich sein,strip-ansi colors.o
oder zumindeststrip-ansi < colors.o
.strip-ansi < colors.o
, aber aus Erfahrung kennen sich die Leute mit Rohrleitungen besser aus. Ich habe die Antwort aktualisiert.commandlinefu gibt diese Antwort, die sowohl ANSI-Farben als auch Bewegungsbefehle entfernt:
Für nur Farben möchten Sie:
quelle
Die "beantwortete" Frage hat bei mir nicht funktioniert, deshalb habe ich diesen regulären Ausdruck erstellt, um die vom perl Term :: ANSIColor-Modul erzeugten Escape-Sequenzen zu entfernen.
Grawitys regulärer Ausdruck sollte gut funktionieren, aber die Verwendung von + scheint auch in Ordnung zu sein.
quelle
The "answered" question
? Meinen Sie die akzeptierte Antwort? (2) Dieser Befehl funktioniert nicht - er wird nicht einmal ausgeführt - weil er ein nicht übereinstimmendes (unsymmetrisches) Zitat enthält. (3) Dies ist eine nutzlose Verwendung voncat
( UUOC ) - es sollte möglich sein, dies zu tun . (4) Wer hat jemals etwas über die Codes in einer Datei gesagt ?perl -pe
command
colors.o
.o
Ich glaube, dies ist eine autorisierende Entfernung aller ANSI-Escape-Sequenzen :
(Bitte beachten Sie, dass Perl, wie viele andere Sprachen (aber nicht sed), übernimmt
\e
als Escape - Zeichen Esc,\x1b
oder\033
durch Code, gezeigt in Terminals wie^[
. Ich verwende es hier , weil es noch intuitiver zu sein scheint.)Dieser Perl-Befehl, den Sie bei Bedarf alle in einer Zeile ausführen können, enthält vier Ersetzungen:
Die erste geht nach CSI-Sequenzen (Escape-Code-Sequenzen, die mit dem "Control Sequence Introducer" von beginnen Esc[, der viel mehr abdeckt als die Select Graphic Rendition-Sequenzen , aus denen die Farbcodes und andere Textdekorationen bestehen).
Die zweite Ersetzung entfernt die verbleibenden Sequenzen, die nachfolgende Zeichen enthalten, und endet mit ST (dem String-Terminator Esc\). Der dritte Ersatz ist das Gleiche, aber ermöglicht auch Betriebssystem - Befehlssequenzen mit einem bis Ende BEL (
\x07
,\007
, oft\a
).Der vierte Ersatz entfernt die verbleibenden Fluchten.
Ziehen Sie auch in Betracht, andere ASCII-Zeichen mit der Breite Null wie BEL und andere undurchsichtige C0- und C1-Steuerzeichen zu entfernen . Ich habe benutzt
s/[\x00-\x1f\x7f-\x9f\xad]+//g
, was auch Delete und Soft Hyphen beinhaltet . Dies schließt Unicodes höher codierte Nullbreitenzeichen aus, aber ich glaube, dass es für ASCII (Unicode\x00
-\xff
) erschöpfend ist . Wenn Sie dies tun, entfernen Sie diese zuletzt, da sie an längeren Sequenzen beteiligt sein können.quelle
"tput sgr0" hat dieses Steuerzeichen verlassen ^ (B ^ [
Hier ist eine modifizierte Version, um das zu erledigen .
quelle
tput sgr0
was die anderen Lösungen anscheinend nie loswerden können.Ich hatte ein ähnliches Problem mit dem Entfernen von Zeichen, die beim Sammeln interaktiver Top-Ausgaben über Putty hinzugefügt wurden, und dies half:
quelle
cat
( UUOC ) - es sollte möglich sein, dies zu tun .perl -pe
command
putty1.log
Das hat bei mir funktioniert (getestet unter Mac OS X)
quelle