Apologies, that was HTML. From: Dan Moseley Sent: Sunday, December 27, 2020 3:42 PM To: peff@xxxxxxxx Cc: carenas@xxxxxxxxx; git@xxxxxxxxxxxxxxx; sunshilong369@xxxxxxxxx Subject: Re: How can I search git log with ceratin keyword but without the other keyword? >> I wonder why this command doesn't work well. >> I intend to find the comment with the keyword "12" but without "comments" >> whereas the output is something like this: >> >> git log --perl-regexp --all-match --grep=12 --grep '\b(?!comments\b)\w+' >> commit f5b6c3e33bd2559d6976b1d589071a5928992601 >> Author: sunshilong <mailto:sunshilong369@xxxxxxxxx> >> Date: 2020-04-12 23:00:29 +0800 >> >> comments 2020.04.12 ng > >I think this is the thing I was mentioning earlier. That negative >lookahead means the second one wouldn't match "comments", but it would >still match "2020.04.12" or "ng". So it won't do what you want. > >I can't think of a way to do what you want just a regex, but maybe >somebody more clever than me can. git log --perl-regexp --grep='^(?!.*comments).*12.*$' The first part fails to match if the line contains 'comments' but it does not consume anything, so the second part '.*12.*' begins at the start of the line and matches '12' anywhere in the line. Of course you can extend the positive and negative parts, e.g., git log --perl-regexp --grep='^(?!.*(comments|abc)).*(12|def).*$' means "lines that don't contain `comments` and don't contain `abc` but do contain `12` or `def` - Dan