在多行中使用Git Grep搜索多个词汇

12

我想使用git grep命令查找包含两个预设单词(如果两个单词都存在,即进行 AND操作)的文件,假设这两个单词是word1word2

我尝试过:

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

同时我也尝试过

git grep 'word1'.*'word2'

但是这两种方式只有在word1word2在同一行时才会检索到结果,而第二种方式则不会在word2出现在行首时进行检索,这并不是我想要的。

我希望能够检索到这些文件,即使这两个单词不在同一行(我不确定它们之间有多少行,顺序也不重要;任何顺序都应该被获取)。

这是否可能?


3
也许可以像 git grep -l word1 | xargs git grep -l word2 这样做... 如果你的文件名中包含空格或其他奇怪字符,可能需要再进行一些尝试和调整... - twalberg
3个回答

10

4

您可以做到

git grep -l word1 |xargs grep -l word2

-l选项会列出文件名而非匹配的行。

这是将它们输入到第二个右侧grep中(xargs是一个实用的管道函数)所必需的。

我猜你对右侧也使用-l会比较满意,否则它会显示与word2匹配的,而没有提到word1


刚刚看到@twalberg的评论,他推荐了类似的解决方案。

这让我想起,如果您在文件名上有问题,您需要一些额外的参数:

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

或者 git grep -zl word1 | xargs -0 git grep -l word2 - CervEd

0

由于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行。


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