Git Grep多行多词

olhwl3o2  于 2023-01-15  发布在  Git
关注(0)|答案(3)|浏览(124)

我想git grep具有两个预先指定的单词的文件(如果两个单词都存在,即AND ing),假设这两个单词是word1word2
我试过了

git grep -e 'word1' --and -e 'word2'

我也试过

git grep 'word1'.*'word2'

但是这两个函数都只在word1word2位于同一行时才检索结果,而第二个函数在word2位于该行的第一个时不检索结果,这是我不希望看到的。
我想检索文件,即使这两个词不在同一行(我不确定它们之间有多少行,顺序并不重要;应获取任何订单)。
这可能吗?

kcrjzv8t

kcrjzv8t1#

无法使用git-grep搜索多行。
取自:http://git.661346.n2.nabble.com/bug-git-grep-P-and-multiline-mode-td7613900.html
是的,而且是故意的,以避免考虑“多行匹配如何与'grep-n'交互?”
我们的行为就像是将每行内容一次一行地提供给由-P/-E/-G/-F选项选择的匹配引擎,因此这个限制不太可能改变。

x7rlezfr

x7rlezfr2#

你能做到

git grep -l word1 |xargs grep -l word2

-l选项列出文件名而不是匹配行。
这对于将它们输入到右侧第二个grep是必要的(xargs是一个实用管道函数)
我猜你会对右手边的-l感到满意,否则它会显示与word2匹配的 * 行 *,而不引用word1
刚刚看到@twalberg的评论,它推荐了一个类似的解决方案。
这提醒了我,如果您在文件名方面遇到困难,您需要一些额外的参数:

git grep -zl word1 |xargs -0 grep -l word2
n6lpvg4x

n6lpvg4x3#

由于git-grepgrep一样匹配每行的模式,因此实现这一点的方法是分解问题。
首先,找到包含word1的所有文件,在这些文件中找到word2
基本上是git grep -l word1 | xargs git grep word2
一个更完整的示例如下所示

git grep -z --name-only word1 |
  xargs -0 git grep -z --name-only word2 |
  xargs -0 grep -zPl 'word1.*\n{0,5}.*word2'

这将查找word2位于word1之后且最多以5行分隔的所有文件。

相关问题