git grep <regex containing newline>
Asked Answered
G

2

6

I'm trying to grep all line breaks after some binary operators in a project using git bash on a Windows machine.

Tried the following commands which did not work:

$ git grep "[+-*\|%]\ *\n"
fatal: command line, '[+-*\|%]\ *\n': Invalid range end

$ git grep "[+\-*\|%]\ *\n"
fatal: command line, '[+\-*\|%]\ *\n': Invalid range end

OK, I don't know how to include "-" in a character set, but still after removing it the \n matches the character n literally:

$ git grep "[+*%] *\n"
somefile.py:            self[:] = '|' + name + '='
                                      ^^^

Escaping the backslash once (\\n) has no effect, and escaping it twice (\\\n) causes the regex to match \n (literally).

What is the correct way to grep here?

Gschu answered 21/1, 2017 at 8:21 Comment(0)
E
6

I don't know how to include "-" in a character set

There is no need to escape the dash character (-) if you want to include it in a character set. If you put it the first or the last character in set it doesn't have its special meaning.

Also, there is no need to escape | inside a character range. Apart from ^ (when it's the first character in the range), - (when it is not the first or the last character in the range), ] and \ (when it is used to escape ]), all other characters have their literal meaning (i.e no special meaning) in a character range.

There is also no need to put \n in the regexp. The grepping tools, by default, try to match the regexp against one row at a time and git grep does the same. If you need to match the regexp only at the end of line then put $ (the end of line anchor) as the last character of the regexp.

Your regexp should be [-+*|%] *$.

Put together, the complete command line is:

git grep '[-+*|%] *$'
Extrusive answered 21/1, 2017 at 9:32 Comment(1)
Thanks! I had to use grep '[-+*|%]\s*$' to account for windows line endings. It turns out that I could also find the answer in grep manual. See also: Is it better to use git grep than plain grep if we want to search in versioned source code?Gschu
P
0

How to find a newline in the middle of a line

For lack of better option I think I'll start with:

sudo apt install pcregrep
git grep --cached -Il '' | xargs pcregrep -Mb 'y\nl'

this combines:

The output clearly shows the filename and line number, e.g.:

myfile.txt:123:my
love
myfile.txt:234:my
life
otherfile.txt:11:my
lion

Tested on Ubuntu 22.04.

Pucker answered 13/6, 2022 at 17:5 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.