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 grep
ped 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, m
gefolgt 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 ␛[31m
macht Text rot und ␛[22m
dreht es auf Weiß zurück, eingefügt sowohl grep
um die m
Zeichen 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 grep
in grep --color=always
und hexdump
piping 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 grep
fü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 grep
direkt 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 grep
Ausgabe 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 dumb
Terminaltyp 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.)