git grep <regex containing newline>

6
我正在尝试使用git bash在Windows机器上搜索项目中所有二进制运算符后的换行符
尝试了以下命令但没有成功:
$ git grep "[+-*\|%]\ *\n"
fatal: command line, '[+-*\|%]\ *\n': Invalid range end

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

好的,我不知道如何在字符集中包含“ - ”,但是即使删除它,\n仍然与字符n匹配:

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

反斜线只转义一次(\\n)没有作用,而连续转义两次(\\\n)会导致正则表达式匹配\n(字面上的反斜线和n)。

这里正确的grep方式是什么?

2个回答

6
我不知道如何在字符集中包含“-”。
如果要将减号(-)放入字符集中,则无需转义。 如果将其放置在集合中的第一个或最后一个字符,则它没有其特殊含义。
此外,在字符范围内,无需转义|。 除了 ^ (当它是范围中的第一个字符时), - (当它不是范围中的第一个或最后一个字符时),] \ (当用于转义]时),所有其他字符在字符范围内具有其字面含义(即没有特殊含义)。
在正则表达式中也不需要加上\n。默认情况下,grep工具尝试一次匹配一个行与正则表达式,并且 git grep 做相同的事情。 如果您仅需要在行末匹配正则表达式,则将$(行尾锚)作为正则表达式的最后一个字符。
您的正则表达式应该是:[-+*|%] *$
总的来说,完整的命令行如下:
git grep '[-+*|%] *$'

谢谢!我不得不使用 grep '[-+*|%]\s*$' 来解决Windows换行符的问题。结果我在 grep手册 中也找到了答案。另请参见:如果我们想搜索版本控制的源代码,是否最好使用git grep而不是普通grep? - AXO

0

如何在一行中查找换行符

由于没有更好的选择,我想我会从以下开始:

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

这个组合包括:

输出清楚地显示了文件名和行号,例如:

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

已在Ubuntu 22.04上进行测试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接