I want to git grep
the files which has two pre-specified words (if both exist, i.e. AND
ing), 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 ?
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.
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
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With