Verarbeiten Sie ANSI-Escape-Codes vor dem Verlegen

1043
Tiddo

Ich versuche, die Ausgabe eines Skripts (Mocha) an ein anderes Skript zu übergeben. Es gibt jedoch ein Problem: Mocha generiert viele Ansi-Escape-Zeichen, um den Bildschirm im Handumdrehen zu aktualisieren. Diese Zeichen werden auch durch die Pipe gesendet.

Gibt es eine Möglichkeit, die ANSI-Sequenz so zu verarbeiten, dass die Ausgabe der endgültigen Ausgabe auf dem Bildschirm entspricht? Ich möchte Farbwechselsequenzen behalten, aber die Cursorbewegung entgeht nicht.

Edit: Ich habe jetzt eine Teillösung (nur für Mocha): Bisher scheint es, dass Mocha mit der Spec-Ausgabe (die ich benutze) nur Farb-Ecape-Zeichen und die CSI 0GEscape-Sequenz generiert . Das CSI 0GEscape-Zeichen bedeutet, dass sich der Cursor an den Anfang der Zeile bewegen soll. Mocha verwendet dies, um eine Zeile vollständig zu überschreiben. Daher könnte man einfach einen Sed regexp schaffen, die alles bis zu dieser Escape - Sequenz in einer Zeile löschen wird: sed 's/^.*\x1b\[0G//g'. Ich suche immer noch nach der kompletten Lösung.

3
Die gleiche Frage besteht hier http://stackoverflow.com/questions/6306728/remove-ansi-codes-when-storing-script-output dset0x vor 11 Jahren 0
@zmode ist nicht das Gleiche, dass es darum geht, alle ansi-Codes zu entfernen, wohingegen das OP hier "Farbwechselsequenzen behalten will" eis vor 11 Jahren 0
@Tiddo Weißt du, wie das andere Skript die Farbverläufe handhaben würde? es würde seltsam klingen, dass es mit ihnen umgehen könnte ... eis vor 11 Jahren 0
@eis - Das andere Skript ist [ansifilter] (http://www.andre-simon.de/doku/ansifilter/de/ansifilter.html). Es generiert farbigen HTML-Code aus der Ansi-Eingabe. Es ist zwar in der Lage, Farbwechsel zu handhaben, kann es aber aus irgendeinem Grund nicht mit den Bewegungszeichen umgehen. Tiddo vor 11 Jahren 0
@Tiddo ok, macht Sinn. eis vor 11 Jahren 0

1 Antwort auf die Frage

0
NighttimeDriver50000
sed -e 's/\x1b\[[0-9?]\+[^m0-9?]//g' 

sollte alle Escape-Codes entfernen, bei denen es sich nicht um "Select Graphic Rendition" -Codes handelt - z. B. Farbe, Fett, Kursiv.

Bearbeiten: Sie sollten Ihren sed 's/^.*\x1b\[0G//g'Filter auch vor meinem Filter verwenden, wenn der vorherige Text tatsächlich überschrieben werden soll. Andernfalls wird sowohl der vorherige als auch der neue Text ausgegeben. Wenn Sie alle Sequenzen wollen durchgeführt werden, so dass der Ausgang der gleiche wie was würde angezeigt in einem Terminal - Emulator, dann würden Sie irgendeine Art von Hintergrund - Terminal - Emulator machen müssen, dass alle Codes tatsächlich ausführen kann, und bei diesem Punkt würde ein solches Projekt in den Schatten gestellt ansifilter.