重击颜色输出失败


8

是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

期望以粗体突出显示TEST。

Answers:


11

sed\e视为转义序列。随着GNU sed和其他大多数sed的实现在那里,\es替换文本只是手段e。你可以在移植应用的唯一反斜杠s替换文本都\\意味着一个反斜杠,\&是指文字&\/(这里/是分隔符)的文字/,并\1通过\9进行反向引用。GNU sed和BusyBox(但不包括OpenBSD sed)添加\n换行符。因此,您sed命令的输出具有文字e

在bash中,您可以从一开始就轻松地在变量中添加文字转义符。\e是构建体识别的转义序列之一$'…'

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

6

您的echo命令中有两个问题。

为了简洁起见,我扩展了变量。

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

第一个问题:反斜线丢失在sed魔术和shell魔术之间。你必须逃避他们。

$ 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

最后,反斜杠即将通过。我不知道为什么我们需要三个反斜杠,这是一些奇怪的魔法。

第二个问题: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

在输出中有大胆的测试。

这是带有更改的完整脚本:

#!/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}"显示`\ AAAA`。可惜的是,因为我需要保留regular_color_constants和SED_color_constants。实际上,我只希望有regular_color_constants,并修复echo和sed选项以获得所需的内容。
2011年

该解决方案相当脆弱(如果$string包含反斜杠,该怎么办?)并且比必需的要复杂得多。要了解报价,请一次处理一件事情。例如,三个反斜杠根本不是sed魔术:首先用双引号引起来,然后"\\\e"是两个字符的字符串\e;然后sed理解\e为“ e字面上的字符”。
吉尔(Gilles)'所以
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.