sed不能用特殊字符替换子字符串

时间:2018-09-17 16:41:48

标签: bash macos terminal

[Mac / Terminal]我正尝试用红色版本的句子替换句子中的单词。我正在尝试使用sed,但是它没有以我期望的格式输出结果。即

for w in ${sp}; do
    msg=`echo $msg | sed "s/$w/\\033[1;31m$w\\033[0m/g"`
done

导致:

033[1;31mstb033[0m 033[1;31mshu033[0m 033[1;31mkok033[0m

其中$ sp是$ msg中包含的单词子集的列表

所需的输出如下:

\033[1;31mstb\033[0m \033[1;31mshu\033[0m \033[1;31mkok\033[0m

然后我希望echo -e可以正确地解释这一点并显示红色。但是,到目前为止,我似乎还不太正确地理解sed是如何工作的。

2 个答案:

答案 0 :(得分:1)

这似乎效率很低。为什么不简单地一次性替换所有单词并立即输入实际的转义码呢?

sp='one two three'
msg='one little mouse, two little mice, three little mice'
echo "$msg" | sed -E "s/${sp// /|}/^[[1;31m&^[[0m/g"

输出(我使用粗体标记红色 1 ):

one little mouse, two little mice, three little mice

sed -E选项仅是为了允许我们使用更简单的正则表达式语法(在Linux和其他平台上,请尝试sed -r或将脚本翻译为Perl)。

您将键入 ctrl-V esc ,在上面的命令行中会看到^[

如果您需要将消息包含在变量中以供重复使用,请查看printf -v


不幸的是,

1 看起来像Stack Overflow doesn't support <span style="color:red">

答案 1 :(得分:1)

如何使用数组和printf instead of echo

$ sp="Now is the time..."
$ w=( $sp )
$ printf -v output '\e[1;31m%s\e[0m ' "${w[@]}"
$ echo "$output"
Now is the time... 

输出显然是红色的,doesn't come across here,但是:

$ printf '%q\n' "$output"
$'\E[1;31mNow\E[0m \E[1;31mis\E[0m \E[1;31mthe\E[0m \E[1;31mtime...\E[0m '

如果您不喜欢尾随空格,可以使用${output% }对其进行修剪。

相关问题