Есть идеи, что может быть причиной этого? Без использования 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'
Нормальный выход:
grep
terminal
pipe
escape-characters
Freedo
источник
источник
grep
s, а также результатalias grep
иtype grep
?Ответы:
Снимок экрана показывает искаженные цветовые коды ANSI , которые управляют отображением текста. Текст, выделенный жирным шрифтом / ярким шрифтом, создается в последовательности
␛[1m
, которая обычно интерпретируется вашим терминалом и не отображается непосредственно на экране: он просто делает следующий фрагмент текста ярким. Снимок экранаgrep
вывода un ped показывает, что разница в цвете между метками и значениями в каждой строке, поэтому исходный вывод использует их.Похоже, что эта последовательность была нарушена вашим финалом
grep
, который совпал с буквой «m» в коде (поскольку это буква[a-z]
) и попытался выделить его красным цветом. Это оставило после себя частичную escape-последовательность, которую ваш терминал не смог обработать.␛
Экранирующий символ - U + 001B, представляющий собой шестнадцатеричное число, отображаемое в ячейках неизвестного символа. То, что отображается, это escape (поле), a[
, a1
, красный,m
за которым следует ожидаемый соответствующий текст «eng», и то же самое происходит в конце с «22» (числовой код для «нормального цвета и интенсивности»).Неверный вывод действительно:
где
␛[31m
делает текст красным и␛[22m
превращает его обратно в белый, оба вставляютсяgrep
вокругm
символов в исходный текст. Оригинал был просто:который просто яркий "
eng
", а затем переключиться обратно на обычный текст.Вы можете проверить это, изменив свой финал
grep
наgrep --color=always
и добавив в него трубопроводhexdump
, который покажет все непечатаемые символы и символы, интерпретируемые вашим терминалом.С этим можно справиться несколькими способами. Одним из них является использование
grep
без вашего псевдонима на данный момент:Обратная косая черта временно пропускает псевдоним и запускается
grep
напрямую.Другой способ состоит в удалении кодов ANSI из исходной команды, для чего есть некоторые предложения в этом вопросе :
Еще один вариант - добавить на конец постороннюю трубу:
Поскольку
grep
вывод финала не напрямую в TTY, аcat
через канал, он не вставит цветную подсветку.Возможно, лучший вариант - заставить Translate Shell прекратить использовать последовательности управления терминалами в своем собственном выходе, в первую очередь, когда он не подключен к терминалу. Это может включать в себя сообщение об ошибке от вашего автора (ей) и исправление кода для функции Translate Shell
ansi()
, но это можно несколько исправить:Это передает
dumb
тип терминала в среде Translate Shell, которую он по крайней мере распознает как не имеющую поддержку цвета ECMA-48. (К сожалению, Translate Shell не использует terminfo, а просто внедряет в свой собственный код типы терминалов, которые он понимает, и последовательности управления, которые он использует.)источник
GREP_COLOR
илиGREP_COLORS
переменная окружения, которая содержит полные escape-последовательности SGR, а не только числа.--color=no
к окончательному grep (или применитьTERM=dumb
к нему)