Снимок экрана показывает искаженные цветовые коды 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, а просто внедряет в свой собственный код типы терминалов, которые он понимает, и последовательности управления, которые он использует.)