regexgitgit-grep

git grep <regex containing newline>


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?


Solution

  • 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 '[-+*|%] *$'