Lo screenshot sembra mostrare i codici colore ANSI alterati , che controllano il rendering del testo. Il testo in grassetto / luminoso viene prodotto con la sequenza ␛[1m
, che di solito viene interpretata dal terminale e non viene visualizzata direttamente sullo schermo: rende il testo successivo luminoso. Lo screenshot grep
dell'output di un ped mostra la differenza di colore tra le etichette e i valori su ogni riga, quindi l'output originale li sta usando.
Sembra che quella sequenza sia stata interrotta dal tuo finale grep
, che corrispondeva alla "m" nel codice (poiché è una lettera [a-z]
) e ha cercato di evidenziarlo in rosso stesso. Ciò ha lasciato dietro di sé una sequenza di escape parziale, che il terminale non è stato in grado di elaborare.
Il carattere di escape ␛
è U + 001B, che è il numero esadecimale visualizzato nelle caselle dei caratteri sconosciuti. Ciò che viene visualizzato è l'escape (la casella), a [
, a 1
, un rosso m
seguito dal testo corrispondente "eng", e lo stesso accade alla fine con "22" (il codice numerico per "colore e intensità normali").
L'output interrotto è davvero:
␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m
dove ␛[31m
rende il testo rosso e lo ␛[22m
trasforma in bianco, entrambi inseriti grep
attorno ai m
caratteri nel testo originale. L'originale era solo:
␛ [1m eng ␛ [22m
che è semplicemente " eng
" luminoso e quindi tornare al testo normale.
Si potrebbe verificare questo cambiando la finale grep
in grep --color=always
e tubazioni in hexdump
, che mostrerà tutti i caratteri non stampabili e quelli interpretati da terminale.
Puoi affrontarlo in alcuni modi. Uno è di usare grep
senza il tuo alias per il momento:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
La barra rovesciata salta temporaneamente l'alias e viene eseguita grep
direttamente.
Un altro è quello di eliminare i codici ANSI dal comando originale, per i quali ci sono alcuni suggerimenti in questa domanda :
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
Ancora un'altra opzione è quella di aggiungere un tubo estraneo alla fine:
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
Poiché l' grep
output del finale non è direttamente sul TTY, ma cat
tramite una pipe, non inserirà l'evidenziazione colorata.
Forse l'opzione migliore è far sì che Translate Shell smetta di usare le sequenze di controllo del terminale nel suo stesso output, in primo luogo quando non è in un terminale. Ciò implicherebbe correttamente una segnalazione di bug da parte dei suoi autori e una correzione di codice per tradurre la ansi()
funzione di Shell , ma si può evitare un po ':
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
Questo passa il dumb
tipo di terminale nell'ambiente Translate Shell, che riconosce almeno non avere il supporto del colore ECMA-48. (Purtroppo, Shell Shell non utilizza terminfo e collega semplicemente nel proprio codice i tipi di terminale che comprende e le sequenze di controllo che utilizza.)