Seltsame Symbole auf dem Bildschirm bei der Verwendung von grep?

12

./trans ... Befehlsausgabe mit Escape-Codes

Irgendeine Idee, was das verursachen könnte? Ohne grep werden nur die ISO-Codes und der leere Raum angezeigt.

Software verwendet

Befehl: ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

root@box /test # alias grep
alias grep='grep --color=auto'
root@box /test # type grep
grep is aliased to `grep --color=auto'

Normale Ausgabe:

Trans-Befehlsausgabe mit lesbarem Text und URLs

Freedo
quelle
Bitte fügen Sie die Ausgabe ein, anstatt ein Bild anzuhängen. Damit andere den eingefügten Befehl wiederverwenden können, um ihn auf ihren Systemen zu reproduzieren.
Thushi
9
@Thushi In diesem Fall ist ein Screenshot angebracht, da die fehlenden Glyphensymbole hier nicht eingefügt werden könnten.
Sparhawk
Können Sie Screenshots des Befehls bearbeiten , ohne die nachfolgenden greps und das Ergebnis von alias grepund auszuführen type grep?
Michael Homer

Antworten:

28

Der Screenshot scheint verstümmelte ANSI-Farbcodes zu zeigen, die die Textwiedergabe steuern. Fett / heller Text wird mit der Sequenz erzeugt ␛[1m, die normalerweise von Ihrem Terminal interpretiert und nicht direkt auf dem Bildschirm angezeigt wird: Sie bringt nur die nächste Textstelle zum Leuchten. Der Screenshot der un grepped Ausgabe zeigt den Farbunterschied zwischen den Beschriftungen und Werten in jeder Zeile, sodass die ursprüngliche Ausgabe diese verwendet.

Es scheint, dass diese Sequenz von Ihrem Finale unterbrochen wurde grep, das mit dem "m" im Code übereinstimmt (da es ein Buchstabe ist [a-z]) und versucht hat, ihn selbst rot hervorzuheben. Dadurch blieb eine teilweise Escape-Sequenz zurück, die Ihr Terminal nicht verarbeiten konnte.

Das Escape-Zeichen ist U + 001B. Hierbei handelt es sich um die Hexadezimalzahl, die in den Feldern für unbekannte Zeichen ausgegeben wird. Was angezeigt wird, ist das Escape (das Kästchen), a [, a 1, ein Rot, mgefolgt von dem erwarteten passenden Text "eng", und dasselbe passiert am Ende mit "22" (dem numerischen Code für "normale Farbe und Intensität").


Die kaputte Ausgabe ist wirklich:

␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m 

wo ␛[31mmacht Text rot und ␛[22mdreht es auf Weiß zurück, eingefügt sowohl grepum die mZeichen in den ursprünglichen Text. Das Original war nur:

 ␛ [1m eng ␛ [22m 

Das ist nur hell " eng" und dann ein Wechsel zurück zum normalen Text.

Sie können dies überprüfen, indem Sie Ihr final grepin grep --color=alwaysund hexdumppiping in ändern , in denen alle nicht druckbaren Zeichen und die von Ihrem Terminal interpretierten Zeichen angezeigt werden.


Sie können auf verschiedene Arten damit umgehen. Eine davon ist grepfür den Moment ohne Ihren Alias ​​zu verwenden:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

Der Backslash überspringt vorübergehend den Alias ​​und wird grepdirekt ausgeführt.

Eine andere Möglichkeit besteht darin, die ANSI-Codes aus dem ursprünglichen Befehl zu entfernen, für die es in dieser Frage einige Vorschläge gibt :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

Eine weitere Option besteht darin, am Ende ein überflüssiges Rohr hinzuzufügen:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

Da die grepAusgabe des Finales nicht direkt zum TTY, sondern catüber eine Pipe erfolgt, wird die farbige Hervorhebung nicht eingefügt.

Vielleicht ist es die beste Option, Translate Shell zu veranlassen, die Verwendung von Terminal-Steuersequenzen in der eigenen Ausgabe zu beenden, wenn es sich nicht um ein Terminal handelt. Das würde einen Fehlerbericht von Ihnen an die Autoren und eine Code-Korrektur für die ansi()Funktion von Translate Shell beinhalten, aber man kann etwas dagegen unternehmen:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

Damit wird der dumbTerminaltyp in der Umgebung von Translate Shell übergeben, der zumindest als nicht ECMA-48-Farbunterstützung eingestuft wird. (Leider verwendet Translate Shell kein terminfo und verdrahtet lediglich in seinem eigenen Code die Terminaltypen, die es versteht, und die von ihm verwendeten Steuersequenzen.)

Michael Homer
quelle
wow, ich würde das niemals alleine und ohne einen Ort wie diesen debuggen können, also danke!
Freedo
IMO der Täter könnte leicht eine kaputte GREP_COLORoder GREP_COLORSUmgebungsvariable sein, die komplette SGR-Escape-Sequenzen enthält, anstatt nur die Zahlen.
Egmont
Wow, so viele Lösungen. Sie können auch --color=nodas abschließende Grep hinzufügen (oder es anwenden TERM=dumb)
Ángel