Странные символы на экране при использовании grep?

12

./trans ... вывод команды с кодами перехода

Есть идеи, что может быть причиной этого? Без использования grep отображаются только элементы кода ISO и пустое место.

Программное обеспечение используется

Команда: ./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'

Нормальный выход:

вывод команды trans с читаемым текстом и URL

Freedo
источник
Пожалуйста, вставьте вывод вместо прикрепления изображения. Чтобы другие могли повторно использовать вставленную команду для воспроизведения того же в своих системах.
Туши
9
@Thushi В этом случае уместен скриншот, потому что они не смогут вставить сюда недостающие символы глифа.
Sparhawk
Можете ли вы отредактировать на скриншотах команду run без завершающего greps, а также результат alias grepи type grep?
Майкл Гомер

Ответы:

28

Снимок экрана показывает искаженные цветовые коды ANSI , которые управляют отображением текста. Текст, выделенный жирным шрифтом / ярким шрифтом, создается в последовательности ␛[1m, которая обычно интерпретируется вашим терминалом и не отображается непосредственно на экране: он просто делает следующий фрагмент текста ярким. Снимок экрана grepвывода un ped показывает, что разница в цвете между метками и значениями в каждой строке, поэтому исходный вывод использует их.

Похоже, что эта последовательность была нарушена вашим финалом grep, который совпал с буквой «m» в коде (поскольку это буква [a-z]) и попытался выделить его красным цветом. Это оставило после себя частичную escape-последовательность, которую ваш терминал не смог обработать.

Экранирующий символ - U + 001B, представляющий собой шестнадцатеричное число, отображаемое в ячейках неизвестного символа. То, что отображается, это escape (поле), a [, a 1, красный, mза которым следует ожидаемый соответствующий текст «eng», и то же самое происходит в конце с «22» (числовой код для «нормального цвета и интенсивности»).


Неверный вывод действительно:

␛ [1 ␛ [31м мэн ␛ [22м ␛ [22 ␛ [ 31м м ␛ [22м] 

где ␛[31mделает текст красным и ␛[22mпревращает его обратно в белый, оба вставляются grepвокруг mсимволов в исходный текст. Оригинал был просто:

 1 [1m eng ␛ [22m 

который просто яркий " eng", а затем переключиться обратно на обычный текст.

Вы можете проверить это, изменив свой финал grepна grep --color=alwaysи добавив в него трубопровод hexdump, который покажет все непечатаемые символы и символы, интерпретируемые вашим терминалом.


С этим можно справиться несколькими способами. Одним из них является использование grepбез вашего псевдонима на данный момент:

./trans --id --input /path/to/txt | grep ISO | \grep [a-z]

Обратная косая черта временно пропускает псевдоним и запускается grepнапрямую.

Другой способ состоит в удалении кодов ANSI из исходной команды, для чего есть некоторые предложения в этом вопросе :

./trans --id --input /path/to/txt | perl -pe 's/\e\[[\d;]*m//g' | grep ISO | grep [a-z]

Еще один вариант - добавить на конец постороннюю трубу:

./trans --id --input /path/to/txt | grep ISO | grep [a-z] | cat

Поскольку grepвывод финала не напрямую в TTY, а catчерез канал, он не вставит цветную подсветку.

Возможно, лучший вариант - заставить Translate Shell прекратить использовать последовательности управления терминалами в своем собственном выходе, в первую очередь, когда он не подключен к терминалу. Это может включать в себя сообщение об ошибке от вашего автора (ей) и исправление кода для функции Translate Shell ansi(), но это можно несколько исправить:

TERM=dumb ./trans --id --input /path/to/txt | grep ISO | grep [a-z]

Это передает dumbтип терминала в среде Translate Shell, которую он по крайней мере распознает как не имеющую поддержку цвета ECMA-48. (К сожалению, Translate Shell не использует terminfo, а просто внедряет в свой собственный код типы терминалов, которые он понимает, и последовательности управления, которые он использует.)

Майкл Гомер
источник
вау, я бы никогда не смог отладить это сам и без такого места, так что спасибо!
Фридо
IMO виновником может быть просто неработающая переменная GREP_COLORили GREP_COLORSпеременная окружения, которая содержит полные escape-последовательности SGR, а не только числа.
egmont
Вау, так много решений. Вы также можете добавить --color=noк окончательному grep (или применить TERM=dumbк нему)
Анхель