Zrzut ekranu wydaje się wyświetlać zniekształcone kody kolorów ANSI , które sterują renderowaniem tekstu. Pogrubiony / jasny tekst jest tworzony za pomocą sekwencji ␛[1m
, która jest zwykle interpretowana przez terminal i nie jest wyświetlana bezpośrednio na ekranie: po prostu rozjaśnia następny fragment tekstu. Zrzut ekranu grep
wyjścia un ped pokazuje różnicę kolorów między etykietami a wartościami w każdym wierszu, więc oryginalne wyjście wykorzystuje je.
Wygląda na to, że ta sekwencja została przerwana przez twój końcowy grep
, który pasował do „m” w kodzie (ponieważ jest to litera [a-z]
) i próbował wyróżnić go na czerwono. Pozostawił za sobą częściową sekwencję ucieczki, której terminal nie mógł przetworzyć.
␛
Znakiem ucieczki jest U + 001B, który jest liczbą szesnastkową renderowaną w polach znaków nieznanych. Wyświetla się znak ucieczki (pole), a [
, a 1
, czerwony, m
po którym następuje oczekiwany pasujący tekst „eng”, i to samo dzieje się na końcu z „22” (kod numeryczny „normalny kolor i intensywność”).
Zepsuty wynik to naprawdę:
␛ [1 ␛ [31m meng ␛ [22m ␛ [22 ␛ [31m m ␛ [22m
gdzie ␛[31m
zmienia kolor na czerwony i ␛[22m
zmienia go z powrotem w biały, oba wstawiane grep
wokół m
znaków w oryginalnym tekście. Oryginał był po prostu:
␛ [1m eng ␛ [22m
który jest po prostu jasny „ eng
”, a następnie powrót do normalnego tekstu.
Możesz to sprawdzić, zmieniając końcowy grep
na grep --color=always
i przesyłając potok do hexdump
, który pokaże wszystkie znaki niedrukowalne i te interpretowane przez terminal.
Możesz sobie z tym poradzić na kilka sposobów. Jednym z nich jest na razie użycie grep
bez twojego aliasu:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
Odwrotny ukośnik tymczasowo pomija alias i uruchamia się grep
bezpośrednio.
Innym jest usunięcie kodów ANSI z oryginalnego polecenia, co do którego istnieją sugestie w tym pytaniu :
./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]
Jeszcze inną opcją jest dodanie na końcu zewnętrznej rury:
./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat
Ponieważ wynik końcowy grep
nie jest bezpośrednio przekazywany do TTY, ale cat
poprzez potok, nie wstawi kolorowego podświetlenia.
Być może najlepszą opcją jest skłonienie Translate Shell do zaprzestania używania sekwencji sterujących terminalu we własnym wyjściu, gdy nie jest to terminal. To właściwie wymagałoby zgłoszenia błędu od ciebie do jego autora (autorów) i poprawki kodu do funkcji Tłumacz Shell ansi()
, ale można to nieco zepsuć:
TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]
To przekazuje dumb
typ terminala w środowisku Translate Shell, które przynajmniej rozpoznaje jako nie posiadające obsługi kolorów ECMA-48. (Niestety, Tłumacz Powłoka nie używa terminfo, a jedynie wbudowuje we własnym kodzie typy terminali, które rozumie, i sekwencje kontrolne, których używa.)