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.
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:
grep
terminal
pipe
escape-characters
Freedo
la source
la source
grep
s finaux , et le résultat dealias grep
ettype grep
?Réponses:
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 lagrep
sortie 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[
, a1
, un rougem
suivi 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:
où
␛[31m
rend le texte rouge et␛[22m
le retourne au blanc, tous deux insérés pargrep
autour desm
caractères dans le texte d'origine. L'original était juste:qui est juste brillant "
eng
" puis un retour au texte normal.Vous pouvez vérifier cela en changeant votre final
grep
engrep --color=always
et votre tuyauterie enhexdump
, 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
grep
sans votre alias pour le moment:La barre oblique inverse ignore temporairement l'alias et s'exécute
grep
directement.Une autre consiste à supprimer les codes ANSI de la commande d'origine, pour laquelle il existe quelques suggestions dans cette question :
Encore une autre option consiste à ajouter un tuyau étranger à l'extrémité:
Parce que la
grep
sortie de la finale n'est pas directement vers le TTY, maiscat
via 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:Cela passe le
dumb
type 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.)la source
GREP_COLOR
ouGREP_COLORS
variable d'environnement contenant des séquences d'échappement SGR complètes, plutôt que simplement des chiffres.--color=no
à la grep finale (ou l'appliquerTERM=dumb
)