2016-08-08 1 views
0

Wenn Sie die Zeichenfolge "Hello, \e[38;5;200mworld\e[0m" drucken, wird möglicherweise "Hello, world" mit dem Wort "world" eine starke Magentafarbe (FF00DF) angezeigt, vorausgesetzt, Ihr Terminal unterstützt es.Wie ignorierst du aber ANSI-Escape-Codes mit sed?

Wenn Sie jedoch die Ausgabe eines Programms wie tree an column übergeben, sehen Sie, dass die Ausrichtung unterbrochen ist, da die Escape-Codes in Zeilenlängenberechnungen falsch gezählt werden.

Als ein direkteres Beispiel habe ich versucht, die Zeichenfolge von Schriftzeichen in Sed mit dem folgenden aufzuspalten:

sed 's/\(.\)/\1 /g'

... ..., die

H e l l o , 3 8 ; 5 ; 2 0 0 m w o r l d 0 m

ergibt ... wenn die zuvor gezeigte Zeichenfolge gepiped wurde.

Wie würden Sie bei der Bearbeitung eines Streams nach passenden Escapecodes zum Zählen, Ersetzen, Bewahren usw. suchen?

+0

Warum würden Sie 'tree' Ausgabe an' column' übergeben. Wenn Sie die Einfärbung deaktivieren ('tree -n | column'), erhalten Sie die gewünschte Ausgabe (außer dem Farbteil)? – anishsane

+0

Ich nicht; Die Farbe ist jedoch immer noch sichtbar, also vermute ich, dass einer meiner Aliasnamen interferiert. Ich übertrage viele Dinge in die Spalte, wenn es zu viel Ausgabe gibt, um ohne Scrollen zu sehen, was in einem gemultiplexten Terminal bedeutet, dass ich nicht ständig hin und her schalten muss. Natürlich kann ich einen unfokussierten Bereich scrollen und mein Original fokussiert lassen, aber das Scrollen bedeutet immer noch das Bewegen der Maus. Bin ich nicht faul? –

Antwort

1

, die wahrscheinlich nicht genau das ist, was Sie suchen, aber Sie können die Idee weiter entwickeln:

Sie Steuerzeichen entfernen col mit:

$ col -bx 

oder sed mit:

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

Sie können diesen regulären Ausdruck zum Extrahieren verwenden t Sequenzen, die nicht gezählt oder anderweitig verarbeitet werden sollen.

Ein anderes interessantes Projekt, das für Sie nützlich sein kann ist ansifilter.

+0

Das Einzeiler sed ist genau das, was ich suchte! Das Zusammenführen der Codes nach der Bearbeitung des gefilterten Streams scheint eine sehr schwierige Aufgabe zu sein, aber sicherlich eine Frage für einen anderen Tag. Ich danke dir sehr! –

+0

Ich schaue auf 'filterdiff' für den Fall, dass jemand anderen diesen Weg geht. Ich denke, dass ich in jeder Phase differieren kann, zuerst, wenn ich die Escape-Codes entferne, und zweitens, wenn ich den Stream bearbeite, und dann die Änderungen von der ersten abwende. –