Использование sed для окраски вывода команды на солярисе

29

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

Команда на Linux (вывод «test» правильно окрашен красным):

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

Команда на солярис (вывод «тест» не окрашен):

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

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

ACM
источник

Ответы:

35

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

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

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

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

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

echo "test" | sed "s,.*,$(tput setaf 1)&$(tput sgr0),"
Жиль "ТАК - перестань быть злым"
источник
это прекрасно работает, чтобы раскрасить cat |sedслишком THX!
Водолей Сила
8

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

tput setaf 1; somecommand; tput sgr0

или

tput setaf 1
somecommand
tput sgr0

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

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

bahamat
источник
Спасибо за ответ. Как я уже говорил ранее, я не могу изменить команду echo. 'echo' - это просто замена процесса, который я вызываю, который я не могу изменить. Можно ли как-то использовать sed с tput? Кроме того, когда я запускаю эту команду на sunOS 5.10, я не вижу никаких цветов.
ACM
Я обновил его, чтобы разбить его на отдельные команды.
Багамат
Это лучше, чем моя текущая реализация, поскольку она не печатает исходные коды ascii на солярисе. Однако (по какой-либо причине) он не окрашивает вывод 'somecommand' на солярисе. Это на Linux. Я принял ответ @Gilles, который делает оба. Спасибо.
ACM
0

Некоторые терминалы (например, bash in iterm для меня) позволяют вам нажимать клавиши «ctrl-v», а затем «ctrl + [», и это помещает буквенный escape-символ во входную строку. Если это сработает, вы, вероятно, увидите символы «^ [», напечатанные на экране, но если вы наведете курсор на него, он будет обрабатываться как один символ, потому что он действительно за кадром.

Чтобы понять, что происходит (и проверить, возможно ли это), вы можете набрать ctrl + v, а затем ctrl + i. Вы должны увидеть, что символ табуляции был вставлен в строку приглашения. Существует история CS, объясняющая, почему это так: но оказывается, что на действительно старой клавиатуре был ctrl + I, жестко запрограммированный для отправки символа табуляции; и клавиша Tab посылает тот же электрический сигнал тоже.

По этой традиционной причине bash для многих терминалов по-прежнему интерпретирует определенные коды Ctrl для сопоставления с теми же символами.

Ctrl + I отображается на символ табуляции, а ctrl + [совпадает с escape-символом ascii.

Александр Берд
источник