6 Stimmen

Wie man ANSI-Farb-Escape-Codes aus fmt ausblendet

Ich verwende (GNU) fmt um längere Texte mit schönen ('optimalen') Zeilenumbrüchen zu formatieren. Enthält der Text jedoch ANSI-Farb-Escape-Sequenzen (die nie angezeigt werden und nur dazu dienen, den Text bei der Anzeige einzufärben), kann es zu einer Fehlfunktion kommen, fmt betrachtet diese als normale Zeichen und berechnet die falschen Zeilenlängen.

Ich bin mir nicht sicher, wie gut wörtliche Escape-Zeichen hier funktionieren, deshalb hier ein einfaches Beispiel mit grep um die ANSI-Sequenzen zu erzeugen. Beginnen wir mit einer langen Zeichenkette zum Formatieren.

string="Here’s an example of a rather long \
string with quite a few words in the middle \
that grep chooses to colour red."

Wenn wir nicht auf die grep passt, funktioniert alles bestens:

echo $string | grep --color=no i | fmt -w 50

Aber wenn wir sie hervorheben/einfärben, fmt geht davon aus, dass die Zeilen, die den Buchstaben "i" enthalten, viel länger sind, als sie tatsächlich sind, und sie werden als ziemlich kurze Zeilen angezeigt, wenn sie in einem Terminal angezeigt werden.

echo $string | grep --color=yes i | fmt -w 50

Gibt es eine Möglichkeit, dies zu vermeiden? Für dieses Beispiel könnte ich natürlich Folgendes verwenden fmt vor grep aber wenn sich der Suchbegriff über mehrere Wörter erstreckt, funktioniert das nicht.

5voto

Coding With Style Punkte 1682

Es scheint keine gute Möglichkeit zu geben, dies mit grep und fmt zu lösen. Ich empfehle Ihnen, zuerst fmt auszuführen und dann sed anstelle von grep für die Suche zu verwenden. Zum Beispiel:

echo The search string will be highlighted red. | fmt -w 50 | sed ":a;$!N;$!ba;s/search\[ \\n\]string/\\x1b\\\[1;31m&\\x1b\\\[0m/g"

0 Stimmen

Danke. Das ist die Lösung, die ich letztendlich verwendet habe. Meine reale Verwendung dieser tatsächlich beinhaltet sed anstelle von grep . Im Grunde genommen konvertiere ich Tags (wie | en this is an |example| string ) zu ANSI-Farbsequenzen, um die Wörter, die sie umspannen, einzufärben. Verwendung von fmt vor dem Ersetzen ist nicht optimal, da die Tags etwas Platz einnehmen, was sich auf den Wortumbruch auswirkt, aber es ist nicht allzu schlimm, solange eine Zeile nicht sehr viele solcher Tags enthält, und es ist besser als die Ausführung von fmt nach dem Ersetzen (da die ANSI-Escape-Sequenzen viel mehr Zeichen beanspruchen).

1voto

Rolf Punkte 999

Sie können verwenden hmt dafür. Sie wurde genau für dieses Szenario konzipiert.

Anmerkung: Ich bin der Autor von hmt .

0voto

iCrazy Punkte 2746

Wenn Sie stattdessen `grep --colour=auto' verwenden, ist das Problem gelöst.

0 Stimmen

Nein, das würde es nicht. Verwendung von grep --colour=auto hat das gleiche Ergebnis wie die Verwendung von grep --colour=no in diesem Beispiel.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X