0

[Mac/Terminal] I'm trying to replace words in a sentence with red-colored versions of them. I'm trying to use sed, but it's not outputting the result in the format I'm expecting. i.e.

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

results in:

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

where $sp is a list of a subset of words contained in $msg

the desired output would look like:

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

and then my hope would be that echo -e would interpret this correctly and show the red coloring instead. So far, however, I seem to not understand quite correctly how sed works in order to accomplish this.

jajabarr
  • 551
  • 2
  • 5
  • 19

2 Answers2

1

This seems hugely inefficient. Why do you not simply replace all the words in one go and put in the actual escape codes immediately?

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

Output (where I use bold to mark up the red color1):

one little mouse, two little mice, three little mice

The sed -E option is just to allow us to use a simpler regex syntax (on Linux and some other platforms, try sed -r or simply translate the script to Perl).

You would type ctrl-V esc where you see ^[ in the command line above.

If you need the message in a variable for repeated use, look at printf -v


1 Looks like Stack Overflow doesn't support <span style="color:red">, unfortunately.

tripleee
  • 175,061
  • 34
  • 275
  • 318
1

What about using an array, and 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... 

The output is obviously red, which doesn't come across here, but:

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

And if you don't like the trailing space, you can trim it with ${output% }.

ghoti
  • 45,319
  • 8
  • 65
  • 104
  • That just colors all the words, I *think* the OP wants to replace the words in `$msg` which occur in `$sp` (which probably contains something like `"ERROR WARNING INFO DEBUG"`). – tripleee Sep 18 '18 at 04:10