Il y a deux problèmes dans votre echo
commande.
J'ai développé les variables par souci de concision.
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
Premier problème: les contre-obliques se perdent quelque part entre la magie sed et la magie shell. Vous devez leur échapper.
$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test
Ça ne marche toujours pas. Peut-être plus échappant?
$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test
Finalement, les contre-obliques arrivent. Je ne sais pas pourquoi nous avons besoin de trois barres obliques inverses, c'est de la magie sed séduisante.
Deuxième problème: le echo -e
est inutile. -e
permet d'interpréter les échappements de barre oblique inverse, mais tout ce qui echo -e
arrive à interpréter est "test TEST test"
. Les échappements de barre oblique inversée proviennent de sed, qui ne se soucie pas d'eux et les imprime bruts.
Ce que vous voulez c'est:
$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test
avec un TEST gras en sortie.
Voici le script complet avec les modifications:
#!/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}"
affiche «\ AAAA». C'est dommage, car je dois garder regular_color_constants et SED_color_constants. En fait, je veux avoir seulement regular_color_constants, et corriger les options echo et sed pour obtenir ce que je veux.$string
contient une barre oblique inverse) et est un peu plus compliquée que nécessaire. Pour comprendre la citation, prenez les choses une par une. Par exemple, les trois barres obliques inverses ne sont pas du tout de la magie sed: d'abord il y a des guillemets doubles, et"\\\e"
c'est la chaîne de deux caractères\e
; alors sed comprend\e
comme "le personnagee
littéralement".