Symboles étranges à l'écran lors de l'utilisation de grep?

12

Sortie de commande ./trans ... montrant les codes d'échappement

Une idée de ce qui pourrait en être la cause? Sans utiliser grep, les seuls éléments affichés sont les codes ISO et l'espace vide.

Logiciels utilisés

Commander: ./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'

Sortie normale:

sortie de commande trans avec texte et URL lisibles

Freedo
la source
Veuillez coller la sortie au lieu de joindre une image. Pour que d'autres puissent réutiliser la commande collée pour la reproduire sur leurs systèmes.
Thushi
9
@Thushi Dans ce cas, une capture d'écran est appropriée, car ils ne pourraient pas coller les symboles de glyphe manquants ici.
Sparhawk
Pouvez-vous éditer des captures d'écran de la commande exécutée sans les greps finaux , et le résultat de alias grepet type grep?
Michael Homer

Réponses:

28

La capture d'écran semble montrer des codes de couleur ANSI mutilés , qui contrôlent le rendu du texte. Le texte en gras / clair est produit avec la séquence ␛[1m, qui est généralement interprétée par votre terminal et non affichée directement à l'écran: elle rend juste le bit de texte suivant lumineux. La capture d'écran de la grepsortie non pédale montre cette différence de couleur entre les étiquettes et les valeurs sur chaque ligne, donc la sortie d'origine les utilise.

Il semble que cette séquence a été interrompue par votre finale grep, qui correspondait au "m" dans le code (puisque c'est une lettre [a-z]) et a essayé de la mettre en surbrillance en rouge elle-même. Cela a laissé une séquence d'échappement partielle que votre terminal n'a pas pu traiter.

Le caractère d'échappement est U + 001B, qui est le nombre hexadécimal rendu dans les cases de caractères inconnus. Ce qui est affiché est l'échappement (la boîte), a [, a 1, un rouge msuivi du texte correspondant attendu "eng", et la même chose se produit à la fin avec "22" (le code numérique pour "couleur et intensité normales").


La sortie cassée est vraiment:

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

␛[31mrend le texte rouge et ␛[22mle retourne au blanc, tous deux insérés par grepautour des mcaractères dans le texte d'origine. L'original était juste:

 ␛ [1m eng ␛ [22m 

qui est juste brillant " eng" puis un retour au texte normal.

Vous pouvez vérifier cela en changeant votre final grepen grep --color=alwayset votre tuyauterie en hexdump, qui affichera tous les caractères non imprimables et ceux interprétés par votre terminal.


Vous pouvez gérer cela de plusieurs façons. L'une consiste à utiliser grepsans votre alias pour le moment:

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

La barre oblique inverse ignore temporairement l'alias et s'exécute grepdirectement.

Une autre consiste à supprimer les codes ANSI de la commande d'origine, pour laquelle il existe quelques suggestions dans cette question :

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

Encore une autre option consiste à ajouter un tuyau étranger à l'extrémité:

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

Parce que la grepsortie de la finale n'est pas directement vers le TTY, mais catvia un tube, elle n'insérera pas la surbrillance colorée.

La meilleure option est peut-être de faire en sorte que Translate Shell cesse d'utiliser les séquences de contrôle de terminal dans sa propre sortie en premier lieu lorsqu'il ne s'agit pas d'un terminal. Cela impliquerait correctement un rapport de bogue de votre part à ses auteurs et un correctif de code pour la ansi()fonction de Translate Shell , mais on peut le contourner quelque peu:

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

Cela passe le dumbtype de terminal dans l'environnement de Translate Shell, qu'il reconnaît au moins comme ne prenant pas en charge les couleurs ECMA-48. (Malheureusement, Translate Shell n'utilise pas terminfo et se contente de câbler dans son propre code les types de terminaux qu'il comprend et les séquences de contrôle qu'il utilise.)

Michael Homer
la source
wow, je ne pourrais jamais déboguer ça tout seul et sans un endroit comme ça, alors merci!
Freedo
OMI, le coupable pourrait facilement être un cassé GREP_COLORouGREP_COLORS variable d'environnement contenant des séquences d'échappement SGR complètes, plutôt que simplement des chiffres.
egmont
Wow, tant de solutions. Vous pouvez également ajouter --color=noà la grep finale (ou l'appliquer TERM=dumb)
Ángel