2015-05-24 5 views
6

Ich lief Shell-Befehle in Python, protokollierte ihre Ausgaben in Dateien und schließlich auf einer Webseite gezeigt. jedoch wurden auch die Farbschemas der Befehlsausgaben protokolliert. Gibt es eine Möglichkeit, die Farbschriftzeichen herauszufiltern oder sie auf Webseiten korrekt anzuzeigen? Danke vielmals!Filter spezielle Zeichen wie Farbcodes aus Shell-Ausgabe

Ausgabeprotokoll:

" 22200K .......\u001b[0m\u001b[91m... .......... ...\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... .........\u001b[0m\u001b[91m.\u001b[0m\u001b[91m \u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... 50% 28.6K 12m55s" 

der eigentliche Text:

[INFO][88] 22250K .......... .......... .......... .......... .......... 50% 35.8K 12m53s 
+0

Siehe z http://stackoverflow.com/q/2033268/3001761 – jonrsharpe

Antwort

4

Im unwahrscheinlichen Fall, wenn Sie xterm256 Farbcodes sowie zu haben, filtert diese beiden 'normalen' ansi und xterm256 ansi-Codes:

import re 
print re.sub(r'\x1b(\[.*?[@-~]|\].*?(\x07|\x1b\\))', '', a) 

oder in einem etwas weniger verschleierte und lesbare Form:

'(' + CSI + '.*?' + CMD + '|' + OSC + '.*?' + '(' + ST + '|' + BEL + ')' + ')' 

kompletter Code mit Tests:

import re 

tests = [ 
    u"22200K .......\u001b[0m\u001b[91m... .......... ...\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... .........\u001b[0m\u001b[91m.\u001b[0m\u001b[91m \u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m.\u001b[0m\u001b[91m...... 50% 28.6K 12m55s", 
    u"=\u001b[m=", 
    u"-\u001b]23\u0007-", 
] 

def trim_ansi(a): 
    ESC = r'\x1b' 
    CSI = ESC + r'\[' 
    OSC = ESC + r'\]' 
    CMD = '[@-~]' 
    ST = ESC + r'\\' 
    BEL = r'\x07' 
    pattern = '(' + CSI + '.*?' + CMD + '|' + OSC + '.*?' + '(' + ST + '|' + BEL + ')' + ')' 
    return re.sub(pattern, '', a) 

for t in tests: 
    print trim_ansi(t) 
2

Dies sollte in den meisten Fällen funktionieren:

import re 
print re.sub(u'\u001b\[.*?[@-~]', '', a) 

aktualisieren

Escape-Sequenzen beginnen mit dem Zeichen ESC (ASCII dezimal 27/hex 0x1B/oktal 033). Bei zwei Zeichenfolgen liegt das zweite Zeichen im Bereich ASCII 64-95 (@ bis _). Die meisten Sequenzen bestehen jedoch aus mehr als zwei Zeichen und beginnen mit den Zeichen ESC und [(linke Klammer). Diese Sequenz wird als CSI für den Kontrollsequenzeinführer (oder den Kontrollsequenzinitiator) bezeichnet. Das letzte Zeichen dieser Sequenzen liegt im Bereich ASCII 64-126 (@ bis ~). (http://en.wikipedia.org/wiki/ANSI_escape_code)

Update2

Mit folgendem 'a.py':

import sys, re 

for line in sys.stdin: 
    sys.stdout.write(re.sub(u'\u001b\[.*?[@-~]', '', line)) 

das funktioniert für mich glatt:

ls --color | python a.py 
+0

Danke, Jettico! Eigentlich hoffe ich auf einen gemeinsamen Weg für alle bunten Muschelausgaben. Das Beispiel, das ich in meiner Frage beschrieben habe, ist nur eines davon. – ucdream

+0

Dies ist eine schnelle und gar nicht universelle Lösung, aber sie soll die meisten in der Praxis verwendeten ANSI-Codes abdecken. Geben Sie ein Beispiel für die Codes, die dieser Chunk nicht gefiltert hat, und ich werde sie auch integrieren. Oder verwenden Sie eine vollwertige Lösung wie von @jonrsharpe vorgeschlagen – jettico

+0

Haben Sie es ausprobiert? – jettico

-1

Sie können einfach Rohr die Ausgabe über strings zu entfernen nicht druckbare Zeichen:

./some-script | strings 
+0

Das funktioniert nicht: 'ls --color | strings' lässt alle Farbcodes unverändert, wobei nur das erste ESC-Symbol weggelassen wird. –