Masz pojęcie, co może być tego przyczyną? Bez użycia grep wyświetlane są tylko kody ISO i puste miejsce.
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ść:
grep
terminal
pipe
escape-characters
Freedo
źródło
źródło
grep
s oraz wynikualias grep
itype grep
?Odpowiedzi:
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 ekranugrep
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[
, a1
, 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ę:
gdzie
␛[31m
zmienia kolor na czerwony i␛[22m
zmienia go z powrotem w biały, oba wstawianegrep
wokółm
znaków w oryginalnym tekście. Oryginał był po prostu:który jest po prostu jasny „
eng
”, a następnie powrót do normalnego tekstu.Możesz to sprawdzić, zmieniając końcowy
grep
nagrep --color=always
i przesyłając potok dohexdump
, 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: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 :
Jeszcze inną opcją jest dodanie na końcu zewnętrznej rury:
Ponieważ wynik końcowy
grep
nie jest bezpośrednio przekazywany do TTY, alecat
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ć: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.)źródło
GREP_COLOR
lubGREP_COLORS
zmienna środowiskowa, która zawiera kompletne sekwencje specjalne SGR, a nie tylko liczby.--color=no
końcowy grep (lub zastosowaćTERM=dumb
go)