Ошибка вывода цвета 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 

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

2 Solutions collect form web for “Ошибка вывода цвета Bash”

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") 
  • Как удалить строки, содержащие IP-адрес?
  • Как изменить столбец в строке в текстовом файле с разделителями табуляции, если он дублируется
  • Изменение формата времени в файле
  • Как напечатать определенные поля, если выполнено условие
  • Извлеките значения из имени файла и добавьте его в текстовый файл
  • Заменить все значения в одном столбце на 1
  • Тестирование регулярного выражения из stdin с помощью grep | sed | awk
  • Усекать конечные запятые из каждой строки на основе 1-го поля в файле с разделителями
  • Команда UNIX для замены в разделителе в зависимости от положения разделителя
  • Может ли строка «abcedf» соответствовать строке «bafcde» в одной строке?
  • печатать строки, если разделенные запятыми поля совпадают в другой строке
  • Interesting Posts
    Linux и Unix - лучшая ОС в мире.