[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是如何工作的。
答案 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% }
对其进行修剪。