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.)