[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是如何工作的。
这看起来非常低效。为什么不直接替换所有单词并立即输入实际的转义码?
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">
。
那么使用数组和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% }
修剪它。