Использование sed для цветного вывода из команды на Solaris

У меня есть сценарий ksh, который должен работать как на Linux, так и на солярии. Я пытаюсь покрасить вывод конкретных команд. Он работает на Linux (в частности, RHEL6), но не на Solaris (SunOS 5.10).

Команда на linux (выход «test» правильно окрашен в красный цвет):

[amartin@linuxbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,' test 

Команда на Solaris (выход «тест» не окрашен):

 [amartin@sunbox:~]$ echo "test" | sed 's,.*,\x1B[31m&\x1B[0m,' x1B[31mtestx1B[0m 

Есть ли способ обработать эту команду таким образом, чтобы выход был красным, без исходных кодов на выходе? Я не могу изменить команду «эхо», потому что это просто заполнение для команды, которую я фактически запускаю.

\xNN – это escape-последовательность в GNU sed, но она не является стандартной и, в частности, недоступна в Solaris.

Вы можете включить буквальный escape-символ в свой скрипт, но это затруднит чтение и редактирование.

Вы можете использовать printf для генерации escape-символа. Он понимает восьмеричные escape-последовательности, а не шестнадцатеричные.

 esc=$(printf '\033') echo "test" | sed "s,.*,${esc}[31m&${esc}[0m," 

Вы можете вызвать tput чтобы сгенерировать заменяющий текст в вызове sed. Эта команда ищет escape-последовательности в базе данных terminfo . Теоретически использование tput делает ваш скрипт более переносимым, но на практике вы вряд ли столкнетесь с терминалом, который не использует escape-коды ANSI .

 echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0)," 

Было бы проще использовать tput

 tput setaf 1; somecommand; tput sgr0 

или

 tput setaf 1 somecommand tput sgr0 

Это устанавливает переднего плана на красный, запускает somecommand который затем отображает вывод в красном цвете, затем очищает последовательность цветов. Это работает, по крайней мере, с bash , zsh и ksh .

См. tmux(1) и terminfo(5) для получения дополнительной информации о том, что вы можете сделать с помощью tput .