¿Símbolos extraños en la pantalla cuando se usa grep?

12

./trans ... salida del comando que muestra códigos de escape

¿Alguna idea de lo que podría estar causando esto? Sin usar grep, lo único que se muestra allí son los códigos ISO y el espacio vacío.

Software utilizado

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

Salida normal:

salida del comando trans con texto legible y URL

Freedo
fuente
Pegue la salida en lugar de adjuntar una imagen. Para que otros puedan reutilizar el comando pegado para reproducir el mismo en sus sistemas.
Thushi
99
@Thushi En este caso, una captura de pantalla es apropiada, porque no podrían pegar los símbolos de glifos que faltan aquí.
Sparhawk el
¿Se puede editar en capturas de pantalla del comando ejecutado sin los greps finales , y el resultado de alias grepy type grep?
Michael Homer

Respuestas:

28

La captura de pantalla parece mostrar códigos de color ANSI destrozados , que controlan la representación del texto. El texto en negrita / brillante se produce con la secuencia ␛[1m, que generalmente es interpretada por su terminal y no se muestra directamente en la pantalla: solo hace que el siguiente fragmento de texto sea brillante. La captura de pantalla de la grepsalida no pedida muestra la diferencia de color entre las etiquetas y los valores en cada línea, por lo que la salida original los está utilizando.

Parece que esa secuencia se ha roto en su final grep, que coincide con la "m" en el código (ya que es una letra [a-z]) e intentó resaltarla en rojo. Eso dejó una secuencia de escape parcial, que su terminal no pudo procesar.

El carácter de escape es U + 001B, que es el número hexadecimal que se representa en los cuadros de caracteres desconocidos. Lo que se muestra es el escape (el cuadro), un [, un 1, un rojo mseguido del texto correspondiente "eng", y lo mismo sucede al final con "22" (el código numérico para "color e intensidad normales").


La salida rota es realmente:

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

donde ␛[31mhace que el texto sea rojo y ␛[22mlo vuelve a poner en blanco, ambos insertados grepalrededor de los mcaracteres en el texto original. El original era solo:

 ␛ [1m eng ␛ [22m 

que es brillante " eng" y luego vuelve al texto normal.

Usted puede comprobar esto cambiando su última grepen grep --color=alwaysy tuberías en hexdump, que mostrará todos los caracteres no imprimibles y los interpretadas por el terminal.


Puedes lidiar con esto de varias maneras. Una es usar grepsin su alias por el momento:

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

La barra invertida omite temporalmente el alias y se ejecuta grepdirectamente.

Otra es quitar los códigos ANSI del comando original, para lo cual hay algunas sugerencias en esta pregunta :

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

Otra opción más es agregar una tubería extraña al final:

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

Debido a que el resultado final grepno es directamente al TTY, sino a cattravés de una tubería, no insertará el resaltado coloreado.

Quizás la mejor opción es hacer que Translate Shell deje de usar secuencias de control de terminal en su propia salida en primer lugar cuando no está en una terminal. Eso implicaría adecuadamente un informe de error de usted a su (s) autor (es) y una corrección de código para la ansi()función Traducir Shell , pero uno puede modificarlo de alguna manera:

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

Esto pasa el dumbtipo de terminal en el entorno de Translate Shell, que al menos reconoce que no tiene soporte de color ECMA-48. (Lamentablemente, Translate Shell no usa terminfo, y simplemente conecta en su propio código los tipos de terminales que entiende y las secuencias de control que usa).

Michael Homer
fuente
wow, nunca podría depurar esto solo y sin un lugar como este, ¡así que gracias!
Freedo
En mi opinión, el culpable podría ser fácilmente una variable rota GREP_COLORo de GREP_COLORSentorno que contiene secuencias de escape SGR completas, en lugar de solo los números.
egmont
Wow, muchas soluciones. También puede agregar --color=noal grep final (o aplicarlo TERM=dumb)
Ángel