我想git grep
具有两个预先指定的单词的文件(如果两个单词都存在,即AND
ing),假设这两个单词是word1
和word2
我试过了
git grep -e 'word1' --and -e 'word2'
我也试过
git grep 'word1'.*'word2'
但是这两个函数都只在word1
和word2
位于同一行时才检索结果,而第二个函数在word2
位于该行的第一个时不检索结果,这是我不希望看到的。
我想检索文件,即使这两个词不在同一行(我不确定它们之间有多少行,顺序并不重要;应获取任何订单)。
这可能吗?
3条答案
按热度按时间kcrjzv8t1#
无法使用
git-grep
搜索多行。取自:http://git.661346.n2.nabble.com/bug-git-grep-P-and-multiline-mode-td7613900.html
是的,而且是故意的,以避免考虑“多行匹配如何与'grep-n'交互?”
我们的行为就像是将每行内容一次一行地提供给由-P/-E/-G/-F选项选择的匹配引擎,因此这个限制不太可能改变。
x7rlezfr2#
你能做到
-l
选项列出文件名而不是匹配行。这对于将它们输入到右侧第二个grep是必要的(xargs是一个实用管道函数)
我猜你会对右手边的
-l
感到满意,否则它会显示与word2
匹配的 * 行 *,而不引用word1
。刚刚看到@twalberg的评论,它推荐了一个类似的解决方案。
这提醒了我,如果您在文件名方面遇到困难,您需要一些额外的参数:
n6lpvg4x3#
由于
git-grep
像grep
一样匹配每行的模式,因此实现这一点的方法是分解问题。首先,找到包含
word1
的所有文件,在这些文件中找到word2
。基本上是
git grep -l word1 | xargs git grep word2
。一个更完整的示例如下所示
这将查找
word2
位于word1
之后且最多以5行分隔的所有文件。