Сохранять цвет при печати с помощью тройника - программирование
Подтвердить что ты не робот

Сохранять цвет при печати с помощью тройника

Я пытаюсь получить вывод программы (имеющей цвета) и выводить ее с помощью tee. Я хочу, чтобы на выходе были цвета на терминале (stdout), но не на выходном файле. Возможно ли это?

4b9b3361

Ответ 1

Возможный подход - напечатать escape-символы на stderr и основное содержимое на stdout. Я сделал это в одном из script. Конечно, это не масштабируемый вариант.

Было бы интересным упражнением написать выделенный script, который анализирует stdin, помещает escape-последовательности на stderr и другие на stdout.:-)
затем ./myScript.sh | filter_escapes | tee outfile.log
Я не видел никаких script, которые это делают, но я думаю, было бы интересно написать один, если он еще не был доступен.

Что касается вашего вопроса, я думаю, что ниже должно быть достаточно:

ls --color=always | sed -r 'w /dev/stderr' | sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/test

замените ls --color=always на. /your _script и /tmp/test на ваше предполагаемое имя выходного файла.

Другая реализация:

ls --color=always | tee >(sed -r 's/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g' > /tmp/abcd)

Примечание: tee >(sed .... > logfile) синтаксис

Примечание:
1. regex заимствован из ответа sampson-chen.
2. Команда w для /dev/stderr в sed - дополнение GNU sed.

Ответ 2

Да, это возможно. Произведите вывод результатов, которые вы хотите перейти в выходной файл с помощью sed, чтобы удалить escape-символы, используемые в цветах форматирования:

В Linux:

sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

В OS X, так как это не GNU sed:

sed -E "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]//g" 

Часть инструмента, который я написал недавно, делает именно то, что вы описали с помощью tee:

https://github.com/sampson-chen/sack/blob/master/sack

 ack --color $sack__flags [email protected] $sack__cwd | tee >$sack__dev_null >(display_shortcuts) >(process_shorcut_paths | remove_escaped_chars > $sack__shortcut_file)

где функция remove_escaped_chars содержит проверку для версии ОС, затем применяет sed script, как показано выше.

(Примечание 1: tee автоматически перенаправляет копию вывода в stdout, поэтому я использовал >$sack__dev_null, чтобы предотвратить это: потому что я хотел добавить дополнительную информацию к материалу, напечатанному на stdout, как определено в функции display_shortcuts)

(Примечание 2: tee сам определенно никогда не удалял форматирование цвета, когда я его использовал. Мое подозрение - поведение других инструментов по умолчанию с каналами.)