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 kann man die ANSI-Farbcodes aus der Ausgabedatei entfernen? Ich denke, 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'
Antwort1
Die Charaktere ^[[37m
und ^[[0m
sind Teil derANSI-Escape-Sequenzen (CSI-Codes). Siehe auchdiese Spezifikationen.
Verwendung von GNUsed
sed -e 's/\x1b\[[0-9;]*m//g'
\x1b
(oder\x1B
) ist dieFluchtSonderzeichen
(GNUsed
unterstützt keine Alternativen\e
und\033
)\[
ist das zweite Zeichen der Escape-Sequenz[0-9;]*
ist der/die Farbwert(e) Regexm
ist das letzte Zeichen der Escape-Sequenz
Verwenden der macOS-Standardeinstellungsed
Mikeschlägt vor:
sed -e $'s/\x1b\[[0-9;]*m//g'
Der macOS-Standard sed
unterstützt keine Sonderzeichen, wie \e
inslmUndDampfer25in den Kommentaren.
Installieren gsed
.
brew install gnu-sed
Beispiel mit der Befehlszeile des OP
(OP steht für Originalposter)
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' |
sed 's/\x1b\[[0-9;]*m//g'
Verbesserungen
Das Flag -e
ist für GNU optional sed
, für den macOS-Standard jedoch erforderlich sed
:
sed 's/\x1b\[[0-9;]*m//g' # Remove color sequences only
Tom Haleschlägt vor, auch alle anderen Escape-Sequenzen zu entfernen, [a-zA-Z]
anstatt nur den m
für die Escape-Sequenz im Grafikmodus (Farbe) spezifischen Buchstaben zu verwenden:
sed 's/\x1b\[[0-9;]*[a-zA-Z]//g' # Remove all escape sequences
Es kann aber [a-zA-Z]
sein, dass es zu breit ist und zu viel entfernt.Michał FaleńskiUndMiguel Mota[mGKH]
schlage vor, nur einige Escape-Sequenzen mit bzw. zu entfernen [mGKF]
.
sed 's/\x1b\[[0-9;]*[mGKH]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKF]//g' # Remove color and move sequences
sed 's/\x1b\[[0-9;]*[mGKHF]//g' # Remove all
Last escape
sequence
character Purpose
--------- -------------------------------
m Graphics Rendition Mode (including color)
G Horizontal cursor move
K Horizontal deletion
H New cursor position
F Move cursor to previous n lines
Britton Keringibt an, K
dass (zusätzlich zu m
) die Farben aus gcc
Fehler/Warnung entfernt werden. Umleitung nicht vergessen gcc 2>&1 | sed...
.
Verwenden vonperl
sed
Die auf einigen Betriebssystemen installierte Version kann begrenzt sein (z. B. macOS). Der Befehl perl
hat den Vorteil, dass er auf mehr Betriebssystemen im Allgemeinen einfacher zu installieren/aktualisieren ist.Adam Katz\e
schlägt vor , (dasselbe wie \x1b
) in zu verwendenPCRE.
Wählen Sie Ihren regulären Ausdruck abhängig davon, wie viele Befehle Sie filtern möchten:
perl -pe 's/\e\[[0-9;]*m//g' # Remove colors only
perl -pe 's/\e\[[0-9;]*[mG]//g'
perl -pe 's/\e\[[0-9;]*[mGKH]//g'
perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
perl -pe 's/\e\[[0-9;]*m(?:\e\[K)?//g' # Adam Katz's trick
Beispiel mit der Befehlszeile des OP:
perl -e 'use Term::ANSIColor; print color "white"; print "ABC\n"; print color "reset";' \
| perl -pe 's/\e\[[0-9;]*m//g'
Verwendung
Wie betont vonStuart CardallKommentar von: Diese sed
Kommandozeile wird vom Projekt verwendetUltimativer Nginx Bad Bot(1000 Sterne) um den E-Mail-Bericht aufzuräumen ;-)
Antwort2
Ich habe einen besseren Escape-Sequenz-Entferner gefunden, wenn Sie MacOS verwenden. Sehen Sie sich das hier an:
perl -pe 's/\x1b\[[0-9;]*[mG]//g'
Antwort3
ansi2txt
https://unix.stackexchange.com/a/527259/116915
cat typescript | ansi2txt | col -b
ansi2txt
: ANSI-Farbcodes entfernencol -b
: entfernen^H
oder^M
Update: zu Spaltengriff-Tabulatoren und Leerzeichen // erwähnt von @DanielF
〇. über col
Handle-Leerzeichen und Tabs
col -bx
Ersetzen Sie '\t' durch ' ',
col -bh
ersetzen Sie ' ' durch '\t'.
// scheint col
so, als ob Leerzeichen/Tabs nicht beibehalten werden können, schade.
0. Originalzeichenfolge
$ echo -e ' ff\tww' | hd
00000000 20 20 20 20 20 20 20 20 66 66 09 77 77 0a | ff.ww.|
1. -h ersetzt Leerzeichen durch Tabulatoren
$ echo -e ' ff\tww' | col -b | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
$ echo -e ' ff\tww' | col -bh | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
$ echo -e ' ff\tww' | col -bxh | hd
00000000 09 66 66 09 77 77 0a |.ff.ww.|
2. -x ersetzt Tabulator durch Leerzeichen
$ echo -e ' ff\tww' | col -bx | hd
00000000 20 20 20 20 20 20 20 20 66 66 20 20 20 20 20 20 | ff |
00000010 77 77 0a |ww.|
$ echo -e ' ff\tww' | col -bhx | hd
00000000 20 20 20 20 20 20 20 20 66 66 20 20 20 20 20 20 | ff |
00000010 77 77 0a |ww.|
3. col
Leerzeichen und Tabulatoren können anscheinend nicht so beibehalten werden, wie sie sind.
Antwort4
Was angezeigt wird, ^[
istnicht ^
und [
; es handelt sich um das ASCII- ESC
Zeichen, das durch Escoder erzeugt wird Ctrl[(die ^
Notation bedeutet die Strg-Taste).
ESC
ist 0x1B hexadezimal oder 033 oktal, also müssen Sie in Ihren regulären Ausdrücken \x1B
oder verwenden:\033
perl -pe 's/\033\[37m//g; s/\033[0m//g'
perl -pe 's/\033\[\d*(;\d*)*m//g'