Símbolos estranhos na tela ao usar o grep?

12

Algumaideiadoquepoderiaestarcausandoisso?Semusarogrep,aúnicacoisaquemostrasãooscódigosISOeoespaçovazio.

Software utilizado

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:

    
por Freedo 19.01.2018 / 06:33

1 resposta

28

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

Parece que essa sequência foi quebrada pelo seu grep final, que corresponde ao "m" no código (já que é uma letra [a-z] ) e tentou realçá-lo no próprio 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), um [ , um 1 , um vermelho m seguido do esperado texto correspondente "eng", e o mesmo acontece no final com "22" (o código numérico para "intensidade normal de cor e intensidade").

A saída quebrada é realmente:

 ␛[1␛[31mmeng␛[22m␛[22␛[31mm␛[22m 

em que ␛[31m torna o texto vermelho e ␛[22m o transforma em branco, ambos inseridos por grep em torno dos caracteres m no texto original. O original foi apenas:

 ␛[1meng␛[22m 

que é apenas " eng " brilhante e depois volta para o texto normal.

Você pode verificar isso alterando seu grep final para grep --color=always e canalizando para hexdump , o que mostrará todos os caracteres não imprimíveis e os interpretados pelo seu terminal.

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

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

A barra invertida salta temporariamente o alias e executa grep diretamente.

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

./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 saída final de grep não é diretamente para o TTY, mas para cat por meio de um canal, ela não insere o realce colorido.

Talvez a melhor opção seja fazer com que o Shell de tradução pare de usar sequências de controle de terminal em sua própria saída, em primeiro lugar, quando não está em um terminal. Isso envolveria apropriadamente um relatório de bug de você para o (s) seu (s) autor (es) e uma correção de código para Traduzir a função ansi() do Shell, mas pode-se contê-lo um pouco:

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

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

    
por 19.01.2018 / 07:56