Dziwne symbole na ekranie podczas korzystania z grep?

12

./trans ... dane wyjściowe polecenia pokazujące kody specjalne

Masz pojęcie, co może być tego przyczyną? Bez użycia grep wyświetlane są tylko kody ISO i puste miejsce.

Użyte oprogramowanie

Komenda: ./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'

Normalna wydajność:

dane wyjściowe polecenia trans z czytelnym tekstem i adresami URL

Freedo
źródło
Wklej wyniki zamiast dołączania obrazu. Aby inni mogli ponownie użyć wklejonego polecenia, aby odtworzyć to samo w swoich systemach.
Thushi,
9
@Thushi W tym przypadku zrzut ekranu jest odpowiedni, ponieważ nie byliby w stanie wkleić tutaj brakujących symboli glifów.
Sparhawk
Czy możesz edytować zrzuty ekranu polecenia uruchamianego bez końcowego greps oraz wyniku alias grepi type grep?
Michael Homer

Odpowiedzi:

28

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

Michael Homer
źródło
wow, nigdy nie byłbym w stanie debugować tego samodzielnie i bez takiego miejsca, więc dziękuję!
Freedo,
IMO sprawcą może być zepsuta GREP_COLORlub GREP_COLORSzmienna środowiskowa, która zawiera kompletne sekwencje specjalne SGR, a nie tylko liczby.
egmont
Wow, tyle rozwiązań. Możesz także dodać --color=nokońcowy grep (lub zastosować TERM=dumbgo)
Ángel