是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
是构造体识别的转义序列之一$'…'
。
ColorOff=$'\e[0m' # Text Reset
BWhite=$'\e[1;37m' # Bold White
答案2
您的命令有两个问题echo
。
为了简洁起见,我扩展了变量。
$ echo -e "test TEST test" | sed -e "s/TEST/\e[1;37mTEST\e[0m/g"
test e[1;37mTESTe[0m test
第一个问题:反斜杠在 sed magic 和 shell magic 之间丢失。你必须逃离他们。
$ 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
最后,反斜杠出现了。我不知道为什么我们需要三个反斜杠,这是一些奇怪的 sed 魔法。
第二个问题: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")