Filter zum Entfernen von Escape-Sequenzen

Du suchst ein Programm für einen bestimmten Zweck?
Antworten
gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Filter zum Entfernen von Escape-Sequenzen

Beitrag von gxyz » 15.10.2011 14:58:08

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 ...)

Benutzeravatar
startx
Beiträge: 3165
Registriert: 07.12.2002 19:29:48
Wohnort: london

Re: Filter zum Entfernen von Escape-Sequenzen

Beitrag von startx » 15.10.2011 18:12:20

ich nehme an das wird ganz gut mit sed gehen. fuer genaue syntax muesstes du die manpage lesen ....

lemak
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

Beitrag von lemak » 15.10.2011 19:51:30

Hallo,

Code: Alles auswählen

tr -d "[:cntrl:]" <$fin >$fout
Sowas in etwa :?: tr und less lassen sich auch mit Pipe-Operator (Filter!?) verwenden.

MfG i

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Filter zum Entfernen von Escape-Sequenzen

Beitrag von gxyz » 16.10.2011 13:34:49

... 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')

cosmac
Beiträge: 4576
Registriert: 28.03.2005 22:24:30

Re: Filter zum Entfernen von Escape-Sequenzen

Beitrag von cosmac » 16.10.2011 16:37:32

hi,
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.
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.

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
Dann muss man Escape- und Control-Sequenzen und noch was unterscheiden:

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.

gxyz
Beiträge: 202
Registriert: 26.07.2010 13:54:21
Lizenz eigener Beiträge: MIT Lizenz

Re: Filter zum Entfernen von Escape-Sequenzen

Beitrag von gxyz » 16.10.2011 17:30:58

cosmac hat geschrieben:Wenn ich jetzt noch was von regexes verstehen würde, hätte ich nicht so viel tippen müssen...
also ich schätze, wenn Du das als regulären Ausdruck hingeschrieben hättest, wäre es nicht viel kürzer geworden ;-)

- 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 ...)

Antworten