Hay dos problemas en su echo
comando.
Expandí las variables por brevedad.
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
Primer problema: las barras invertidas se pierden en algún lugar entre la magia sed y la magia de concha. Tienes que escapar de ellos.
$ echo -e "test TEST test" | sed -e "s/TEST/\\e[1;37mTEST\\e[0m/g"
test e[1;37mTESTe[0m test
Aún no funciona. ¿Quizás más escapando?
$ echo -e "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g"
test \e[1;37mTEST\e[0m test
Finalmente, las barras invertidas están llegando. No tengo idea de por qué necesitamos tres barras invertidas, esa es una extraña magia sed.
Segundo problema: el no echo -e
tiene sentido. -e
permite la interpretación de los escapes de barra invertida, pero todo lo que echo -e
se puede interpretar es "test TEST test"
. Los escapes de la barra invertida provienen de sed, que no se preocupa por ellos y los imprime sin procesar.
Lo que quieres es esto:
$ echo -e $(echo "test TEST test" | sed -e "s/TEST/\\\e[1;37mTEST\\\e[0m/g")
test TEST test
con PRUEBA en negrita en la salida.
Aquí está el script completo con los cambios:
#!/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}"
muestra `\ AAAA`. Es una pena, porque necesito mantener regular_color_constants y SED_color_constants. En realidad, quiero tener solo regular_color_constants, y arreglar las opciones echo y sed para obtener lo que quiero.$string
contiene una barra invertida?) Y es bastante más complicada de lo necesario. Para entender las citas, tome las cosas de una en una. Por ejemplo, las tres barras invertidas no son magia mágica: primero hay comillas dobles, y"\\\e"
es la cadena de dos caracteres\e
; entonces sed entiende\e
como "el personajee
literalmente".