В вашей echo
команде две проблемы .
Я расширил переменные для краткости.
$ 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;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
Наконец, обратные слеши проходят. Я понятия не имею, зачем нам три обратных слэша, это какая-то странная магия sed.
Вторая проблема: 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")
echo -e "${BWhite}AAAA${ColorOff}"
показывает `\ AAAA`. Очень жаль, потому что мне нужно хранить регулярные_цветные_константы и SED_color_constants. На самом деле, я хочу, чтобы у меня были только normal_color_constants, и исправлял параметры echo и sed, чтобы получить то, что я хочу.