Дивні символи на екрані при використанні 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-адреси


Будь ласка, вставляйте вихід, а не додаючи зображення. Так що інші зможуть повторно використати вставлену команду, щоб відтворити те саме в своїх системах.
Сухі

9
@Thushi У цьому випадку скріншот є відповідним, оскільки вони не зможуть вставити відсутні відсутні символи глифів сюди.
Спархак

Чи можете ви редагувати на знімках екрана команди запуск без останнього greps, а результат alias grepі type grep?
Майкл Гомер

Відповіді:


28

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

Здається, що ця послідовність була порушена вашим фіналом grep, який відповідав "m" у коді (оскільки це літера [a-z]) і намагався виділити її червоним кольором. Це залишило позаду часткову послідовність виходу, яку ваш термінал не міг обробити.

Символ втечі - U + 001B, це шістнадцяткове число, відображене у вікнах невідомих символів. Що відображається - це втеча (поле), a [, a 1, червоний, mза яким слід очікувати відповідність тексту "eng", і те саме відбувається в кінці з "22" (числовий код для "нормального кольору та інтенсивності").


Розбитий вихід справді:

␛ [1 ␛ [31 м. ␛ [22 м ␛ [22 ␛ [31 м м ␛ [22 м 

де ␛[31mтекст робить червоним і ␛[22mперетворює його назад у білий, обидва вставлені grepнавколо mсимволів у вихідний текст. Оригінал був просто:

 ␛ [1м eng ␛ [22м 

який просто яскравий " 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через трубу, він не вставить кольорову підсвітку.

Мабуть, найкращим варіантом є змусити перевести Shell припинити використання послідовностей управління терміналом у власному виході, в першу чергу, коли він не переходить до терміналу. Це належним чином передбачає звіт про помилку від вас до її авторів та виправлення коду для ansi()функції Shell Translate , але можна дещо змінити:

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

Це передає dumbтип терміналу в середовищі Translate Shell, який, принаймні, визнає відсутністю підтримки кольорів ECMA-48. (На жаль, Translate Shell не використовує термінфо, а просто провідний провід у власному коді типів терміналів, які він розуміє, і послідовності керування, які він використовує.)


уау, я ніколи не зміг би налагодити це сам і без такого місця, тому дякую!
Фредо

Винувателем IMO легко може бути зламана GREP_COLORабо GREP_COLORSзмінна середовища, яка містить цілі послідовності виходу SGR, а не просто числа.
Егмонт

Ого, так багато рішень. Ви також можете додати --color=noостаточну грапу (або застосувати TERM=dumbдо неї)
Ángel
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.