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.
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.
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
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
精彩评论