sed不能用特殊字符替换substring

问题描述 投票:0回答:2

[Mac /终端]我正在尝试用红色版本替换句子中的单词。我正在尝试使用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是如何工作的。

bash macos terminal
2个回答
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
投票

那么使用数组和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% }修剪它。

© www.soinside.com 2019 - 2024. All rights reserved.