Знімок екрана відображає змішані кольори 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 не використовує термінфо, а просто провідний провід у власному коді типів терміналів, які він розуміє, і послідовності керування, які він використовує.)