Entfernen von ANSI-Farbcodes aus dem Textstrom

Entfernen von ANSI-Farbcodes aus dem Textstrom

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 ^[[37mund ^[[0msind 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
    (GNU sedunterstützt keine Alternativen \eund \033)
  • \[ist das zweite Zeichen der Escape-Sequenz
  • [0-9;]*ist der/die Farbwert(e) Regex
  • mist das letzte Zeichen der Escape-Sequenz

Verwenden der macOS-Standardeinstellungsed

Mikeschlägt vor:

sed -e $'s/\x1b\[[0-9;]*m//g'

Der macOS-Standard sedunterstützt keine Sonderzeichen, wie \einslmUndDampfer25in 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 -eist 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 mfü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, Kdass (zusätzlich zu m) die Farben aus gccFehler/Warnung entfernt werden. Umleitung nicht vergessen gcc 2>&1 | sed....

Verwenden vonperl

sedDie auf einigen Betriebssystemen installierte Version kann begrenzt sein (z. B. macOS). Der Befehl perlhat den Vorteil, dass er auf mehr Betriebssystemen im Allgemeinen einfacher zu installieren/aktualisieren ist.Adam Katz\eschlä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 sedKommandozeile 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 entfernen
  • col -b: entfernen ^Hoder^M


Update: zu Spaltengriff-Tabulatoren und Leerzeichen // erwähnt von @DanielF

〇. über colHandle-Leerzeichen und Tabs

col -bxErsetzen Sie '\t' durch ' ', col -bhersetzen Sie ' ' durch '\t'.

// scheint colso, 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. colLeerzeichen und Tabulatoren können anscheinend nicht so beibehalten werden, wie sie sind.

Antwort4

Was angezeigt wird, ^[istnicht ^und [; es handelt sich um das ASCII- ESCZeichen, das durch Escoder erzeugt wird Ctrl[(die ^Notation bedeutet die Strg-Taste).

ESCist 0x1B hexadezimal oder 033 oktal, also müssen Sie in Ihren regulären Ausdrücken \x1Boder verwenden:\033

perl -pe 's/\033\[37m//g; s/\033[0m//g'

perl -pe 's/\033\[\d*(;\d*)*m//g'

verwandte Informationen