
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コマンドの出力にはリテラルがあります。s
e
s
\\
\&
&
\/
/
/
\1
\9
\n
e
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")