Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Git Grep Multiple Words on Multiple Lines

Tags:

git

git-grep

I want to git grep the files which has two pre-specified words (if both exist, i.e. ANDing), assume these two words are word1 and word2

I tried

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

And also I tried

git grep 'word1'.*'word2'

but both retrieve the results only if word1 and word2 are on the same line, and the second one does not retrieve if word2 comes first in the line, which is something that I don't want.

I want to retrieve the files, even if the two words are not on same line (I am not sure how many lines separates them, and the order is not important; any order should be fetched).

Is this possible ?

like image 631
Ashraf Bashir Avatar asked May 18 '16 15:05

Ashraf Bashir


2 Answers

Searching multi-line with git-grep is not possible.

Taken from: http://git.661346.n2.nabble.com/bug-git-grep-P-and-multiline-mode-td7613900.html

Yes, and deliberately so, to avoid having to think about things like "how would a multi-line match interact with 'grep -n'?"

We behave as if we feed each line of the contents one line at a time to the matching engine that is chosen by the -P/-E/-G/-F options, so this limitation is unlikely to change.

like image 155
alpert Avatar answered Oct 23 '22 04:10

alpert


You can do

git grep -l word1 |xargs grep -l word2

The -l option lists the file name instead of the matching line.

This is necessary to feed them into the second right hand side grep (xargs is a utility piping function)

I'm guessing you'd be happy with -l on the right hand side also as otherwise it would show the lines which match word2 with no reference to word1.


Just seeing @twalberg's comment now which recommends a similar solution.

Which reminds me, if you are having trouble with filenames, you need a few extra arguments:

git grep -zl word1 |xargs -0 grep -l word2
like image 2
EoghanM Avatar answered Oct 23 '22 02:10

EoghanM