Boston Linux & Unix (BLU) Home | Calendar | Mail Lists | List Archives | Desktop SIG | Hardware Hacking SIG
Wiki | Flickr | PicasaWeb | Video | Maps & Directions | Installfests | Keysignings
Linux Cafe | Meeting Notes | Blog | Linux Links | Bling | About BLU

BLU Discuss list archive


[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Discuss] sed and ANSI sequences



Rather than go to that extra trouble, why not just use '\033'
(or '\\033'), which sed ill recognize correctly?



On Sun, Oct 16, 2011 at 8:01 PM, Derek Martin <invalid at pizzashack.org> wrote:
> David,
>
> On Thu, Oct 13, 2011 at 03:00:04PM -0400, David Kramer wrote:
>> 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'
>
> These variables are literal strings, i.e. '\e' here is the
> two-character string, '\' and 'e'. ?The shell's built-in echo command
> (with the -e option ONLY) interprets '\e' as an escape character. ?But
> you're not using it in that context; and sed does not interpret it
> that way. ?Also, the shell is going to interpret '\e' as 'e', which is
> what sed will see. ?You'll need to do two things for this to work:
> First use '\\e', which will give you an escaped '\' as well as the e.
> Then you need to pass this string to echo -e, so that it will get
> interpreted as an escape char.
>
>> > echo "This is a [WARNING] message " | sed -e 's/.*[WARNING].*/'${COLOR_WARN}'&'${COLOR_RESET}'/g;'
>
> This should work, once you properly escape the 'e':
>
> msg=`echo "This is a [WARNING] message " | sed 's//.*[WARNING].*/'${COLOR_WARN}'&'${COLOR_RESET}'/g;'`
> echo -e $msg
>
>
> I tried it locally with this:
>
> $ off='\\e[0m'
> $ bold='\\e[1m'
> $ msg=`echo "bold is as bold does" | sed s/bold/${bold}bold${off}/g`
> $ echo -e "$msg"
> bold is as bold does
>
> And both of the strings "bold" were printed in bold.
>
>> I even tried adding an extra escape backslash
>> > echo "This is a [WARNING] message " | sed -e
>> 's/.*[WARNING].*/\'${COLOR_WARN}'&\'${COLOR_RESET}'/g;'
>
> Again, the trick here is that only echo with the -e option treats '\e'
> as an escape char. ?So you need to feed the result of the sed command
> to echo somehow. ?It does not read from stdin, so the only way I can
> think of to do that is to set a variable to the string you want to
> print, and then echo -e $variable.
>
>> 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''
>
> This works similarly... in this case, printf interprets \033 as an
> escape sequence. ?In both cases though, it's not the shell's
> command-line parser ?doing the interpreting; it's a behavior specific
> to a built-in.
>
>> 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.
>
> Since you're relying on some program to interpret the '\e' sequence as
> a literal escape program, you're stuck launching a separate process,
> whether you go the echo route or the printf route (both are
> shell-builtins in bash). ?If you really want to avoid this, however,
> there is a way: ?Instead of writing '\e' in your code, press CTRL-V
> ESC directly in your code, and that should insert a literal escape
> character right in your code. ?The down side of doing this is that it
> can't be copy-pasted; you'll get a literal '^[' string instead of an
> actual escape character.
>
> But if you find that acceptable, then the following should work:
>
>
> b='^[[1m' # Note that the '^[' is actually CTRL-V ESC
> o='^[[0m'
> echo "This is a [WARNING] message " | sed -e 's/.*[WARNING].*/'${b}'&'${o}'/g;'
>
>
>> Also, I don't understand the doubled single quotes. ?That should be
>> the equivalent of no quotes at all.
>
> I belive so.
>
> --
> Derek D. Martin ? ?http://www.pizzashack.org/ ? GPG Key ID: 0xDFBEAD02
> -=-=-=-=-
> This message is posted from an invalid address. ?Replying to it will result in
> undeliverable mail due to spam prevention. ?Sorry for the inconvenience.
>
>
> _______________________________________________
> Discuss mailing list
> Discuss at blu.org
> http://lists.blu.org/mailman/listinfo/discuss
>
>



-- 
John Abreau / Executive Director, Boston Linux & Unix
Email jabr at blu.org / WWW http://www.abreau.net / PGP-Key-ID 0xD5C7B5D9
PGP-Key-Fingerprint 72 FB 39 4F 3C 3B D6 5B E0 C8 5A 6E F1 2C BE 99



BLU is a member of BostonUserGroups
BLU is a member of BostonUserGroups
We also thank MIT for the use of their facilities.

Valid HTML 4.01! Valid CSS!



Boston Linux & Unix / webmaster@blu.org