Intereting Posts
Linux mint: беспроводное устройство, невостребованное после обновления Отображение переноса wget более компактным способом (при сохранении функциональности обнаружения ошибок) Ошибка «не может выделять память» при попытке создать папку в иерархии групп хотите su без пароля внутри сценария оболочки Продолжает Pinging в фоновом режиме, сохраняет журналы и показывает статистику установка диспетчера синаптических пакетов извне репозиториев Утилита для добавления содержимого в файл, если его еще нет в файле (даже частично) использование команды cat для копирования содержимого файла во все файлы в каталоге (рекурсивно) Некоторые комбинации клавиш недоступны для пользовательских приложений XFCE – запуск ярлыка с правами root без пароля Вывод файла Bash и yml-файла Считается ли синтаксис подстановки команд $ () оператором или командой? Solaris: как пересылать электронные письма cron? Предварительная версия Разработка asp.net mvc на Linux

Ошибка вывода цвета Bash

Это проблема sed или echo? Что я делаю неправильно?

$> cat ~/bin/color_test.sh #!/bin/bash ColorOff='\e[0m' # Text Reset BWhite='\e[1;37m' # Bold White string="test TEST test" echo -e "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g" $> ~/bin/color_test.sh test e[1;37mTESTe[0m test 

На самом деле, я полагаю, чтобы получить ТЕСТ с смелой подсветкой.

sed не рассматривает \e как escape-последовательность. С GNU sed и большинством других реализаций sed там \e в заменяющем тексте s означает только e . Единственная обратная косая черта, которую вы можете использовать портативно в заменяющем тексте, означает \\ что означает обратную косую черту, \& означает букву & , \/ (где / – символ разделителя) для литерала / и \1 до \9 для обратные_связи. GNU sed и BusyBox (но не, например, sed для OpenBSD) добавляют \n для новой строки. Таким образом, выход вашей команды sed имеет буквальный e .

В bash вы можете легко поставить буквальный escape-символ в свои переменные с самого начала. \e – одна из управляющих последовательностей, признанных конструкцией $'…' .

 ColorOff=$'\e[0m' # Text Reset BWhite=$'\e[1;37m' # Bold White 

В вашей команде echo есть две проблемы.

Я расширил переменные для краткости.

 $ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g" test e[1;37mTESTe[0m test 

Первая проблема: обратные косые черты теряются где-то между sed magic и shell magic. Вы должны убежать от них.

 $ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g" test e[1;37mTESTe[0m test 

Все еще не работает. Может быть, больше побегов?

 $ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g" test \e[1;37mTEST\e[0m test 

Окончательно прослеживаются обратные косые черты. Я понятия не имею, почему нам нужны три обратной косой черты, это какая-то странная волшебная магия.

Вторая проблема: echo -e бессмысленна. -e позволяет интерпретировать обратную косую черту, но все echo -e интерпретируется как "test TEST test" . Выпадение обратной косой черты происходит от sed, который не заботится о них и печатает их необработанными.

Что вы хотите, так это:

 $ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g") test TEST test 

с жирным тестом на выходе.

Вот полный скрипт с изменениями:

 #!/bin/bash ColorOff='\\\e[0m' # Text Reset BWhite='\\\e[1;37m' # Bold White string="test TEST test" echo -e $(echo "$string" | sed -e "s/TEST/${BWhite}TEST${ColorOff}/g")