Використання sed для кольорового виводу з команди на solaris


29

У мене є ksh-скрипт, який повинен працювати як на Linux, так і на solaris. Я намагаюся розфарбувати вихід певних команд. Він працює на linux (конкретно RHEL6), але не на solaris (SunOS 5.10).

Команда на linux (вихідний "тест" правильно пофарбований у червоний колір):

[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

Чи є спосіб створити цю команду таким чином, щоб вихід був червоним, без необроблених кодів у висновку? Я не можу змінити команду 'echo', тому що це лише заповнення команди, яку я фактично виконую.

Відповіді:


35

\xNN є послідовністю виходу в GNU sed, але вона не є стандартною, і зокрема вона недоступна для Solaris.

Ви можете включити буквальний символ втечі у свій сценарій, але це ускладнить читання та редагування.

Ви можете використовувати printfдля створення символу втечі. Він розуміє восьмеричні втечі, а не шістнадцяткові.

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

Ви можете зателефонувати tputдля створення тексту заміни у виклику sed. Ця команда шукає послідовності втечі в базі даних 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.


дякую за відповідь. Як я вже говорив раніше, я не можу змінити команду echo. "відлуння" - це лише перешкода процесу, який я дзвоню, і який я не можу змінити. Чи можна якось використовувати sed з tput? Крім того, коли я запускаю цю команду на sunOS 5.10, я не бачу жодних кольорів.
acm

Я оновив його, щоб розбити його на окремі команди.
bahamat

Це краще, ніж моя теперішня реалізація, оскільки вона не друкує необроблені коди ascii на solaris. Однак (з будь-якої причини) він не забарвлює вихід «деякої команди» на сонячні батареї. Це робиться на Linux. Я прийняв відповідь @Gilles, яка робить і те, і інше. Дякую.
acm

0

Деякі термінали (як-от bash в iterm для мене) дозволяють натискати клавіші "ctrl-v", а потім "ctrl + [", і це додасть буквальний символ втечі у рядок введення. Якщо це працює, ви, ймовірно, побачите символи "^ [", надруковані на екрані, але якщо перемістити курсор навколо нього, він буде вважати його одним символом, оскільки він дійсно знаходиться поза кадром.

Щоб зрозуміти, що відбувається (і перевірити, чи це можливо), ви можете ввести ctrl + v, а потім ctrl + i. Ви повинні побачити, що символ вкладки був вставлений у рядок підказок. Існує історія CS, чому це так: але виявляється, що дійсно стара клавіатура мала ctrl + я важко провідна, щоб надіслати символ вкладки; і клавіша вкладки також надсилає той самий електричний сигнал.

З цієї застарілої причини, bash для багатьох терміналів все ще інтерпретує певні коди ctrl для відображення цих самих символів.

Ctrl + I відображає символ символу табуляції, а ctrl + [буває, що відповідає символу втечі ascii.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.