jonderry
jonderry

Reputation: 23643

How to handle color codes when trying to use grep, sed, etc

I'm trying to use sed to process some output of a command that is generating colored lines (it's git diff, but I don't think that's important). I'm trying to match a '+' sign at the beginning of the line but this is being confounded by the color code, which precedes the '+'. Is there a simple way to deal this this issue, or do I need to use some complicated regular expression to match the color code.

If possible I'd like to preserve the coloring of the line.

Upvotes: 11

Views: 2732

Answers (3)

shime
shime

Reputation: 9018

No need to deal with ugly regular expressions, actually. You can just pass the config variable to the git command you're using to preserve coloring.

git -c color.diff=always diff | cat

This works for git status too

git -c color.status=always status -sb | cat

Upvotes: 2

nhed
nhed

Reputation: 5999

This ugly expression should do it

git diff --color src/Strmrs.h| grep $'^\(\x1b\[[0-9]\{1,2\}m\)\{0,1\}+'

  • The $'...' will make the \x1b into the ESC character (aka ^[) - this can probably be avoided, I was too lazy to read the manpage
  • the color sequence (ESC, left-bracket, 1-2 digits, and the letter m) are enclosed in outer set of \(\) which are then made optional with \{0,1\} the only non optional item is the last +.
  • Assumes that there is at most one color sequence at the beginning of the line

Upvotes: 1

mu is too short
mu is too short

Reputation: 434945

If you must have the coloring then you're going to have to do something ugly:

$ git diff --color web-app/db/schema.rb |grep '^^[\[32m+

That ^[ is actually a raw escape character (Ctrl+V ESC in bash, ASCII 27). You can use cat -v to figure out the necessary escape sequences:

$ git diff --color web-app/db/schema.rb |cat -v
^[[1mdiff --git a/web-app/db/schema.rb b/web-app/db/schema.rb^[[m
^[[1mindex 45451a2..411f6e1 100644^[[m
^[[1m--- a/web-app/db/schema.rb^[[m
^[[1m+++ b/web-app/db/schema.rb^[[m
...

This sort of thing will work fine with the GNU versions of sed, awk, ... YMMV with non-GNU versions.

An easier way would be to turn of the coloring:

$ git diff --no-color file

But you can trade pretty output for slightly ugly regular expressions.

Upvotes: 3

Related Questions