Existem dois problemas no seu echo
comando.
Expandi as variáveis por questões de brevidade.
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
Primeiro problema: as barras invertidas são perdidas em algum lugar entre a magia sed e a magia shell. Você tem que escapar deles.
$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test
Ainda não funciona. Talvez mais escapando?
$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test
Finalmente as barras invertidas estão chegando. Não tenho idéia do por que precisamos de três barras invertidas, isso é uma mágica sedutora estranha.
Segundo problema: o echo -e
é inútil. -e
permite a interpretação de escapes de barra invertida, mas tudo o que echo -e
é preciso interpretar é "test TEST test"
. As fugas de barra invertida são provenientes do sed, que não se importa com elas e as imprime em bruto.
O que você quer é isso:
$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test
com TEST negrito na saída.
Aqui está o script completo com as alterações:
#!/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}"
mostra `\ AAAA`. É uma pena, porque eu preciso manter regular_color_constants e SED_color_constants. Na verdade, eu quero ter apenas regular_color_constants e corrigir as opções echo e sed para obter o que quero.$string
contém uma barra invertida?) E é um pouco mais complicada do que o necessário. Para entender as citações, leve as coisas uma por vez. Por exemplo, as três barras invertidas não são absolutamente mágicas: primeiro, há aspas duplas e"\\\e"
é a sequência de dois caracteres\e
; então sed entende\e
como "o personageme
literalmente".