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 grepwyjś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, mpo 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 ␛[31mzmienia kolor na czerwony i ␛[22mzmienia go z powrotem w biały, oba wstawiane grepwokół mznakó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 grepna grep --color=alwaysi 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 grepbez twojego aliasu:
./trans --id --input /path/to/txt | grep ISO | \grep [a-z]
Odwrotny ukośnik tymczasowo pomija alias i uruchamia się grepbezpoś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 grepnie jest bezpośrednio przekazywany do TTY, ale catpoprzez 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 dumbtyp 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.)