Programm, das STDIN mit entfernten Farbcodes an STDOUT übergibt?

64

Ich habe einen Befehl, der eine Ausgabe in Farbe erzeugt, und ich möchte ihn in eine Datei umleiten, deren Farbcodes entfernt wurden. Gibt es einen Befehl, der funktioniert, cataußer dass er Farbcodes entfernt? Ich habe vor, so etwas zu machen:

$ command-that-produces-colored-output | stripcolorcodes > outfile
Ryan Thompson
quelle
4
Es kann ein Fehler sein, dass ein Programm eine farbige Ausgabe erzeugt, obwohl die Ausgabe in eine Datei umgeleitet wird und keine Option zum Ausschalten bietet. Ich würde erwarten, dass jedes Programm, dessen Farben ausgegeben werden, dies isatty(stdin)vorher überprüft . Möchten Sie mitteilen, was das für ein Programm ist?
Alex
pass it through cat- Schnelltest, den ich ausgeführt habe, grep --color=auto myusername /etc/passwdgibt mir meinen Benutzernamen in rot mit weißem Text an anderer Stelle. grep --color=auto myusername /etc/passwd | catgibt mir einfachen weißen Text
Ivanivan
1
Das ist keine Lösung. Dies funktioniert nur, weil grep --color=autokeine farbige Ausgabe erzeugt wird, wenn die Standardausgabe kein Terminal ist. Ich spreche von einem Befehl, der bedingungslos Farbcodes ausgibt. (Wie Alex oben ausführt, ist ein solches Verhalten wahrscheinlich ein Fehler, aber manchmal müssen wir mit unvollständiger Software arbeiten, die wir nicht einfach selbst beheben können, und darum geht es in dieser Frage.)
Ryan Thompson
Möglicherweise relevant unix.stackexchange.com/questions/14684/…
Chris Stryczynski

Antworten:

59

Sie würden denken, dass es dafür ein Dienstprogramm geben würde, aber ich konnte es nicht finden. Dieser Perl-Einzeiler sollte jedoch den Trick machen:

perl -pe 's/\e\[?.*?[\@-~]//g'

Beispiel:

$ command-that-produces-colored-output | perl -pe 's/\e\[?.*?[\@-~]//g' > outfile

Oder, wenn Sie ein Skript möchten, können Sie speichern als stripcolorcodes:

#! /usr/bin/perl

use strict;
use warnings;

while (<>) {
  s/\e\[?.*?[\@-~]//g; # Strip ANSI escape codes
  print;
}

Wenn Sie nur Farbcodes entfernen und andere ANSI-Codes (wie die Cursorbewegung) in Ruhe lassen möchten , verwenden Sie

s/\e\[[\d;]*m//g;

anstelle der Ersetzung, die ich oben verwendet habe (die alle ANSI-Escape-Codes entfernt).

cjm
quelle
9
Wie in einem Kommentar zu einer anderen Antwort ( unix.stackexchange.com/questions/4527/… ) erwähnt, wurde dieser reguläre Ausdruck entferntTerm::ANSIColor . Bitte geben Sie Ihre Quellen an!
Forivall
2
nimm deine Quellen zur Kenntnis!
Jürgen Paul
29

Entfernen Sie Farbcodes (Sonderzeichen) mit GNU sed

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

Oder

Strip ANSI-Escape-Sequenzen in Python

Installieren Sie das colorama Python-Paket ( pip install colorama). Setzen Sie in stripcolorcodes:

#!/usr/bin/env python
import colorama, fileinput, sys;
colorama.init(strip=True);

for line in fileinput.input():
    sys.stdout.write(line)

Rennen chmod +x stripcolorcodes.

jfs
quelle
Das ist fantastisch. Genau das was ich brauchte!
Adivis12
Die Python ist ein bisschen langsam, aber das sedist beeindruckend :)
2
Ich habe Python nicht ausprobiert, aber die sed-Version entfernt nicht alle Farben. (Ich habe nicht ausführlich getestet, aber es hat einige Hintergrundfarben intakt gelassen, also habe ich mich für die schnellere Perl-Option entschieden.)
17.01.18
22

Wenn Sie das Term :: ANSIColor- Modul installieren können, funktioniert dieses Perl-Skript:

#!/usr/bin/env perl
use Term::ANSIColor qw(colorstrip);
print colorstrip $_ while <>;
Ryan Thompson
quelle
5
Das ist eigentlich der Punkt, an dem ich diesen Regex nur mit Farbcodes habe. Aber ein ganzes Modul nur für diesen einen Regex zu installieren, ist ein bisschen viel.
4.
4
Meh, wenn Sie cpanm richtig eingerichtet haben, wird das Modul in ca. 5 Sekunden installiert.
Ryan Thompson
Das Skript muss nicht in die Datei geschrieben werden. Pipe in:perl -mTerm::ANSIColor=colorstrip -n -e 'print colorstrip $_'
Jesse Glick
10

Wenn Ihr System Zugriff auf NodeJS hat, können Sie das folgende Node-Paket installieren strip-ansi-cli.

$ npm install -g strip-ansi-cli

Sie können Ihren Befehl dann folgendermaßen ausführen:

$ command-that-produces-colored-output | strip-ansi > outfile
David McNamara
quelle
1
NodeJS ist eine enorme Abhängigkeit, wenn es Lösungen gibt, die Sprachen und Tools verwenden können, die bereits in den meisten Systemen vorhanden sind.
user137369
Auch dies ist die langsamste Lösung aufgeführt (siehe hier ) , und Sie wahrscheinlich werden den Unterschied bemerken.
3

Dieser sed Befehl hat es für mich getan:

sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g"

Beispiel:

$ command-that-produces-colored-output | sed -r "s/\\^\\[(\\[[^@-~]+[@-~]|[0-9@-_]|%@)//g" > outfile
Ben
quelle
Dies scheint mit der neuesten Version von nicht zu funktionieren sed.
3

Sie können dafür ac verwenden . Es sollte schneller sein als alles, was oben aufgeführt ist (obwohl perlund sedsollte anständig sein). Hier ist ein Beispiel:

curl -s wttr.in/LA | ac -s

Als Haftungsausschluss: Die Farbfilterfunktion wurde von mir geschrieben.


quelle
3
Ein Link zu 'ac' wäre hilfreich. ;)
Vitaly Kushner
Das acProgramm scheint hier zu sein: hub.darcs.net/vmchale/fastcat
Michael Burr
1
$ command-that-produces-colored-output | ansifilter

... und wenn nötig, (dnf, ...) install ansifilter

Joao
quelle