Símbolos estranhos na tela ao usar grep?

12

./trans ... Saída do comando mostrando códigos de escape

Alguma ideia do que poderia estar causando isso? Sem usar grep, as únicas coisas exibidas são os códigos ISO e o espaço vazio.

Software usado

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

Saída normal:

saída do comando trans com texto legível e URLs

Freedo
fonte
Cole a saída em vez de anexar uma imagem. Para que outros possam reutilizar o comando colado para reproduzir o mesmo em seus sistemas.
Thushi 19/01/19
9
@Thushi Nesse caso, uma captura de tela é apropriada, porque eles não poderiam colar aqui os símbolos de glifos ausentes.
Sparhawk
Você pode editar em capturas de tela do comando executado sem os greps à direita e o resultado de alias grepe type grep?
Michael Homer

Respostas:

28

A captura de tela parece mostrar códigos de cores ANSI mutilados , que controlam a renderização de texto. O texto em negrito / claro é produzido com a sequência ␛[1m, que geralmente é interpretada pelo seu terminal e não é exibida diretamente na tela: apenas torna o próximo pedaço de texto brilhante. A captura de tela da grepsaída un ped mostra a diferença de cores entre os rótulos e os valores em cada linha, para que a saída original os use.

Parece que essa sequência foi interrompida pela sua final grep, que correspondia ao "m" no código (já que é uma letra [a-z]) e tentou destacá-la em vermelho. Isso deixou uma sequência de escape parcial para trás, que seu terminal não conseguiu processar.

O caractere de escape é U + 001B, que é o número hexadecimal que é renderizado nas caixas de caracteres desconhecidos. O que é exibido é o escape (a caixa), a [, a 1, um vermelho mseguido pelo texto correspondente esperado "eng" e o mesmo acontecendo no final com "22" (o código numérico para "cor e intensidade normais").


A saída quebrada é realmente:

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

onde ␛[31mtorna o texto vermelho e ␛[22mvolta para branco, ambos inseridos ao grepredor dos mcaracteres no texto original. O original era apenas:

 ␛ [1m eng ␛ [22m 

que é apenas brilhante " eng" e, em seguida, volta ao texto normal.

Você pode verificar isso alterando seu final greppara o grep --color=alwayscanal hexdump, mostrando todos os caracteres não imprimíveis e os interpretados pelo seu terminal.


Você pode lidar com isso de algumas maneiras. Uma é usar grepsem o seu alias no momento:

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

A barra invertida ignora temporariamente o alias e é executado grepdiretamente.

Outra é retirar os códigos ANSI do comando original, para o qual existem algumas sugestões nesta pergunta :

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

Ainda outra opção é adicionar um tubo estranho no final:

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

Como a grepsaída final não é diretamente no TTY, mas catatravés de um tubo, ele não inserirá o realce colorido.

Talvez a melhor opção seja fazer com que o Translate Shell pare de usar seqüências de controle de terminal em sua própria saída em primeiro lugar, quando não estiver em um terminal. Isso envolveria adequadamente um relatório de erro de você para o (s) autor (es) e uma correção de código para a ansi()função do Translate Shell , mas é possível contê-lo um pouco:

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

Isso passa pelo dumbtipo de terminal no ambiente do Translate Shell, que pelo menos reconhece como não tendo suporte a cores ECMA-48. (Infelizmente, o Translate Shell não usa terminfo e apenas conecta em seu próprio código os tipos de terminal que ele entende e as seqüências de controle que ele usa.)

Michael Homer
fonte
uau, eu nunca seria capaz de depurar isso sozinho e sem um lugar como esse, então obrigado!
Freedo
Na IMO, o culpado pode ser facilmente uma variável de ambiente GREP_COLORou quebrada GREP_COLORSque contém sequências de escape SGR completas, em vez de apenas os números.
precisa saber é
Uau, tantas soluções. Você também pode adicionar --color=noao grep final (ou aplicar o TERM=dumba ele)
Ángel