Bashカラー出力に失敗しました

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

太字で強調されたテストが予想されます。

答え1

sed\eエスケープシーケンスとは見なされません。 GNU sedおよび他のほとんどのsed実装では、代替\eテキストの意味はです。代替テキストで移植可能に使用できる唯一のバックスラッシュエスケープ文字は、リテラルを意味するバックスラッシュです。 (区切り記号は)リテラルを表し、逆参照を表します。 。 GNU sedとBusyBox(OpenBSD sedを除く)は改行を追加します。したがって、sedコマンドの出力にはリテラルがあります。ses\\\&&\///\1\9\ne

Bashでは、最初からリテラルエスケープ文字を変数に簡単に追加できます。\e構文が認識するエスケープシーケンスの1つです$'…'

ColorOff=$'\e[0m'       # Text Reset
BWhite=$'\e[1;37m'      # Bold White

答え2

コマンドには2つの問題がありますecho

簡潔さのために変数を拡張しました。

$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test

最初の問題:sedマジックとシェルマジックの間にバックスラッシュがありません。あなたはそれらから脱出する必要があります。

$ 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

最後に、バックスラッシュが表示されます。なぜ3つのバックスラッシュが必要なのかわかりません。奇妙なsed魔法です。

2番目の問題: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

出力には 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")

関連情報