[Discuss] sed and ANSI sequences

David Kramer david at thekramers.net
Thu Oct 13 15:00:04 EDT 2011


I have a script at work that colorizes command outputs.  I've mentioned it here before.  I have
the colors defined in environment variables:
COLOR_ERROR='\e[37;41m'
COLOR_GOOD='\e[32;40m'
COLOR_RESET='\e[0m'
COLOR_WARN='\e[33;40m'

I want to move from using Perl for this to sed.  When I try, the ANSI sequences aren't being
executed so I see them instead of the text colorized.  Here's a small example:

> echo "This is a [WARNING] message " | perl -pe
's/(.*\[WARNING\].*)/'${COLOR_WARN}'$1'${COLOR_RESET}'/g;'

This is a [WARNING] message
(appears in yellow on black as intended)

> echo "This is a [WARNING] message " | sed -e 's/.*[WARNING].*/'${COLOR_WARN}'&'${COLOR_RESET}'/g;'

e[33;40mThis is a [WARNING] message e[0m
(escape codes appear around black on white text)

I even tried adding an extra escape backslash
> echo "This is a [WARNING] message " | sed -e
's/.*[WARNING].*/\'${COLOR_WARN}'&\'${COLOR_RESET}'/g;'

\e[33;40mThis is a [WARNING] message \e[0m
(escape codes appear prefixed with \ around black on white text)

Since sed should not be interpreting the escape sequences, how should it be working any differently?

PS: I did see one working example at
http://travelingfrontiers.wordpress.com/2010/08/22/how-to-add-colors-to-linux-command-line-output/
sed ''/crit/s//$(printf "\033[31mCRITICAL\033[0m")/g''

However, it relies on the printf command, which means (1)launching another process and 2) not
using sed's buffers, so I can't have a series of sed operations in one command.

Also, I don't understand the doubled single quotes.  That should be the equivalent of no quotes at
all.







More information about the Discuss mailing list