nur so aus Neugierde (für das ursprüngliche Problem habe ich einen Work-Around gefunden):
Kennt zufällig jemand ein Programm, das (ANSI-) Escape-Sequenzen aus einem Text entfernen kann? Es fällt mir schwer zu glauben, dass es so etwas banales nicht geben soll, aber mit Google habe ich nur mehr oder weniger gelungene Versuche mit regulären Ausdrücken gefunden, die nicht den Eindruck erwecken, als würden sie auf alle zur Terminal-Steuerung üblichen Sequenzen passen (less -R tut so etwa das, was mir vorschwebt, lässt sich aber nicht als Filter verwenden ...)
Filter zum Entfernen von Escape-Sequenzen
Re: Filter zum Entfernen von Escape-Sequenzen
ich nehme an das wird ganz gut mit sed gehen. fuer genaue syntax muesstes du die manpage lesen ....
-
- Beiträge: 1213
- Registriert: 09.11.2007 13:25:57
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Filter zum Entfernen von Escape-Sequenzen
Hallo,
Sowas in etwa tr und less lassen sich auch mit Pipe-Operator (Filter!?) verwenden.
MfG i
Code: Alles auswählen
tr -d "[:cntrl:]" <$fin >$fout
MfG i
Re: Filter zum Entfernen von Escape-Sequenzen
... es geht mir nicht darum, Escape-Zeichen zu filtern, sondern Escape-Sequenzen, also ein Escape-Zeichen gefolgt von einer variablen Anzahl anderer Zeichen, die nicht dazu gedacht sind auf dem Bildschirm zu erscheinen, sondern zur Steuerung eines Terminals bestimmt sind (und in einer Textdatei nicht gerade die Übersichtlichkeit erhöhen). Natürlich kann man für einen gegebenen Satz solcher Sequenzen einen regulären Ausdruck schreiben, aber dieser wäre zum einen recht länglich und zum anderen vermutlich nicht annähernd vollständig. Wie gesagt, "less -R" macht die Sache zum Betrachten eines mit solchen Kontroll-Sequenzen garnierten Textes ganz gut, lässt aber zum einen Farb-Sequenzen drinnen und macht nur am Ende einer Pipe Sinn (es kann zwar auch innerhalb einer Pipe stehen, verhält sich dann aber einfach wie 'cat')
Re: Filter zum Entfernen von Escape-Sequenzen
hi,
Als Grundlage teilt man die 256 möglichen (ASCII-)Zeichen in 16 Spalten und 16 Zeilen ein:
Escape-Sequenzen beginnen mit ESC (echt jetzt ) und enden mit einem Zeichen aus Spalte 3 bis 7. Dazwischen können beliebig viele Zeichen aus Spalte 2 stehen. Natürlich werden längst nicht alle möglichen Kombinationen verwendet, aber das kann einem Filter ja egal sein. Genau wie der Unterschied zwischen standardisierten, registrierten und privaten Kombinationen.
Control-Sequenzen beginnen genau genommen nicht mit ESC, sondern mit CSI (0x9B). Da das aber ein 8-Bit-Steuerzeichen ist, wird es meistens durch ESC und '[' ersetzt. Ähnlich wie oben folgen dann beliebig viele Zeichen aus den Spalten 2 und 3 und ein Zeichen aus den Spalten 4 bis 7 beendet die Sequenz. Genau genommen dürfen Zeichen aus Spalte 2 nicht mit welchen aus Spalte 3 gemischt werden, aber das kann dem Filter auch wieder egal sein. Hier sind z.B. die bekannten Sequenzen dabei um einen bunten Prompt zu erzeugen. Da in der Spalte 3 die Ziffern und das ';' enthalten sind, ergeben sich sogar halbwegs Menschen-lesbare Zeichenfolgen.
Dann gibt es noch die Control-Funktionen APC (0x9F), DCS (0x90), OSC (0x9D), PM (0x9E) und SOS (0x98) die genau wie CSI eine beliebig lange Zeichenfolge einleiten. Im Unterschied zu CSI ist der Inhalt aber nicht geregelt und das Ende ist immer das 8-Bit-Steuerzeichen ST (0x9C) bzw. in der Praxis ESC plus '\'. Dazu steht auch etwas in "console_codes".
Das sollte es eigentlich gewesen sein. Wenn ich jetzt noch was von regexes verstehen würde, hätte ich nicht so viel tippen müssen...
So schlimm kann es eigentlich nicht sein, zumindest, was die Vollständigkeit angeht. Die Grundregeln sind relativ einfach und ein Filter muss sich ja nicht um Details bestimmter Funktionen kümmern. Die Sequenzen sind ungewöhnlich gut dokumentiert und die Normen ECMA-35 und ECMA-48 sind sogar kostenlos erhältlich. Die Manual Page "console_codes" behandelt unter "Bugs" die beiden Linux-Spezialfälle.gxyz hat geschrieben:Natürlich kann man für einen gegebenen Satz solcher Sequenzen einen regulären Ausdruck schreiben, aber dieser wäre zum einen recht länglich und zum anderen vermutlich nicht annähernd vollständig.
Als Grundlage teilt man die 256 möglichen (ASCII-)Zeichen in 16 Spalten und 16 Zeilen ein:
- 0 und 1: Steuerzeichen (uninteressant bis auf das ESC selbst)
- 2: SPACE bis '/'
- 3: '0' bis '?'
- 4 und 5: '@' bis '_'
- 6 und 7: '`' bis '~' (DEL ist ein Steuerzeichen)
- 8 und 9: Steuerzeichen, die in der Praxis durch ESC plus ein Zeichen aus Spalte 4,5 ersetzt werden
- 10 bis 15: unzulässig
Escape-Sequenzen beginnen mit ESC (echt jetzt ) und enden mit einem Zeichen aus Spalte 3 bis 7. Dazwischen können beliebig viele Zeichen aus Spalte 2 stehen. Natürlich werden längst nicht alle möglichen Kombinationen verwendet, aber das kann einem Filter ja egal sein. Genau wie der Unterschied zwischen standardisierten, registrierten und privaten Kombinationen.
Control-Sequenzen beginnen genau genommen nicht mit ESC, sondern mit CSI (0x9B). Da das aber ein 8-Bit-Steuerzeichen ist, wird es meistens durch ESC und '[' ersetzt. Ähnlich wie oben folgen dann beliebig viele Zeichen aus den Spalten 2 und 3 und ein Zeichen aus den Spalten 4 bis 7 beendet die Sequenz. Genau genommen dürfen Zeichen aus Spalte 2 nicht mit welchen aus Spalte 3 gemischt werden, aber das kann dem Filter auch wieder egal sein. Hier sind z.B. die bekannten Sequenzen dabei um einen bunten Prompt zu erzeugen. Da in der Spalte 3 die Ziffern und das ';' enthalten sind, ergeben sich sogar halbwegs Menschen-lesbare Zeichenfolgen.
Dann gibt es noch die Control-Funktionen APC (0x9F), DCS (0x90), OSC (0x9D), PM (0x9E) und SOS (0x98) die genau wie CSI eine beliebig lange Zeichenfolge einleiten. Im Unterschied zu CSI ist der Inhalt aber nicht geregelt und das Ende ist immer das 8-Bit-Steuerzeichen ST (0x9C) bzw. in der Praxis ESC plus '\'. Dazu steht auch etwas in "console_codes".
Das sollte es eigentlich gewesen sein. Wenn ich jetzt noch was von regexes verstehen würde, hätte ich nicht so viel tippen müssen...
Beware of programmers who carry screwdrivers.
Re: Filter zum Entfernen von Escape-Sequenzen
also ich schätze, wenn Du das als regulären Ausdruck hingeschrieben hättest, wäre es nicht viel kürzer geworden ;-)cosmac hat geschrieben:Wenn ich jetzt noch was von regexes verstehen würde, hätte ich nicht so viel tippen müssen...
- wobei ich gesehen habe, dass es immerhin ein Perl-Modul (http://cpan.uwinnipeg.ca/htdocs/PerlIO- ... scape.html) gibt, um etwas Tipp-Arbeit zu sparen. Trotzdem finde ich es ziemlich erstaunlich, dass sich anscheinend noch niemand erbarmt hat, dafür ein Programm zu schreiben, denn so ganz neu sind die Dinger ja nicht mehr und wenn man in irgendeinem Terminal die Ausgabe mitprotokolliert, bekommt man ziemlich zwangsläufig etwas, dass ohne geeignete Nachbehandlung ziemlich schlecht zu lesen ist. (Ideal wär's natürlich, die Escape-Sequenzen nicht nur zu entfernen, sondern wo möglich auch noch das entsprechende Layout als reinen Text zu reproduzieren ...)