Reputation: 23643
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
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
Reputation: 5999
This ugly expression should do it
git diff --color src/Strmrs.h| grep $'^\(\x1b\[[0-9]\{1,2\}m\)\{0,1\}+'
$'...'
will make the \x1b into the ESC character (aka ^[
) - this can probably be avoided, I was too lazy to read the manpagem
) are enclosed in outer set of \(\)
which are then made optional with \{0,1\}
the only non optional item is the last +
.Upvotes: 1
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