Обработайте управляющие коды ANSI перед передачей в трубопровод

961
Tiddo

Я пытаюсь передать вывод скрипта (Mocha) другому скрипту. Однако есть одна проблема: Mocha генерирует довольно много анси-экранирующих символов для обновления экрана на лету. Эти символы также отправляются через канал.

Есть ли способ обработать последовательность ANSI так, чтобы вывод был таким же, как окончательный вывод на экран? Я хочу сохранить последовательности выхода цвета, но не ускользает движение курсора.

Редактировать: у меня есть частичное решение сейчас (только для Mocha): до сих пор кажется, что Mocha с выходом спецификации (тот, который я использую) генерирует только цветные символы ecape и CSI 0Gescape-последовательность. CSI 0GЭкранирующий символ означает, что курсор должен перемещаться обратно в начало строки. Мокко использует это, чтобы полностью перезаписать строку. Таким образом, вы могли бы просто создать SED регулярное выражение, которое удалит все до той последовательности эвакуации на линии: sed 's/^.*\x1b\[0G//g'. Я все еще ищу полное решение, хотя.

3
Тот же вопрос существует здесь http://stackoverflow.com/questions/6306728/remove-ansi-codes-when-storing-script-output dset0x 11 лет назад 0
@zmode - это не то же самое, что об удалении всех кодов ANSI, тогда как здесь ОП хочет «сохранить последовательности выхода цвета» eis 11 лет назад 0
@ Tiddo Знаете ли вы, как другой скрипт будет обрабатывать побеги цвета? это звучит странно, что он может справиться с ними ... eis 11 лет назад 0
@eis - другой скрипт - [ansifilter] (http://www.andre-simon.de/doku/ansifilter/en/ansifilter.html). Он генерирует цветной HTML из ANSI ввода. По замыслу он способен обрабатывать экранирование цвета, но по какой-то причине не может обрабатывать экранирующие символы движения. Tiddo 11 лет назад 0
@ Тиддо хорошо, имеет смысл. eis 11 лет назад 0

1 ответ на вопрос

0
NighttimeDriver50000
sed -e 's/\x1b\[[0-9?]\+[^m0-9?]//g' 

следует удалить все escape-коды, которые не являются кодами «Выбор графического представления» - например, цвет, жирный, курсив.

Изменить: Вы также должны использовать свой sed 's/^.*\x1b\[0G//g'фильтр перед моим, если вы хотите, чтобы предыдущий текст был фактически перезаписан. В противном случае будет выведен как предыдущий, так и новый текст. Если вы хотите, чтобы все из последовательностей, которые будут осуществляться таким образом, что выход такой же, как то, что будет отображаться в эмуляторе терминала, вы должны были бы сделать какой - то фон эмулятор терминала, который может на самом деле выполнить все коды, и в в этот момент такой проект затмил бы ansifilter.