如何通过管道将git grep
的文件列表搜索到特定模式?
我具体是这样做的:
git grep -l 'string to search'
,我想对上一次搜索的结果文件做另外一个git grep
。
尝试
git grep -l -e 'string to search' --and -e 'another string'
没有给出任何结果,但我知道有匹配项
做
git grep -l 'string to search' | git grep -l 'another string'
与git grep -l 'another string'
答案 0 :(得分:2)
您的第二个git grep
不会将第一个的结果作为参数,而只会输出其预期的内容,而与第一个命令无关。
用一个简单的bash grep替换它,应该这样做
git grep -l 'string to search' | grep 'another string'
答案 1 :(得分:2)
您不能管道名称,但可以供应名称(作为路径规范)到两个git grep
命令之一。
(奇怪的是,--and
首先应该已经完成了您想要的工作-我只是在回答没有--and
时如何做的问题。)
尚不清楚您想要什么结果,但是假设您想要的是:
(其中的某些提交|一些提交的集合|索引|工作树)中的每个文件
如果文件包含模式1
和文件包含模式2的同一文件中其他位置(不一定在同一行)
然后列出文件名
有两种显而易见的方法可以实现这一目标,但是其中一种方法不起作用,因为Git不能在换行符之间进行匹配。 1 因此,我们剩下了另一种显而易见的方法方法:
git grep -l
生成与第一个表达式匹配的文件列表。git grep -l
生成与第二个表达式匹配的文件的列表,(可选)仅从第一个git grep
产生的文件开始。要将它们组合为和操作,您可以选择使用两个git grep -l
输出之一作为另一个git grep
的一系列路径名参数。但是请注意,git grep
在分隔它们的--
之后使用 pathspec 参数,而不是路径 name 参数(请参阅{{3} })。这意味着,如果您的任何文件名中都包含pathspec元字符,则此简单的shell扩展可能会失败。验证第一个grep
确实列出了一些文件,但是将它们组合成一个bash样式命令,可能也是一个好主意:
git grep -l pattern2 -- $(git grep -l pattern1)
通常就足够了。
要将以上两者作为或操作(列出包含任一模式的文件)进行组合,最简单的方法是只使用一个git grep
和多个模式。但是请注意,您可以运行多个git grep -l
操作,并将生成的文件名定向到一个临时文件,然后使用comm
之类的程序报告每组结果的共同点和唯一点。 (这假设您在命令行解释器工具箱中有comm
。)使用comm
还可解决特殊文件名(例如(top)file.c
或got*you.sh
或其他名称)的pathspec问题
1 如果Git did 在换行符之间匹配,则可以使用扩展或Perl模式:(foo(.|\n)*bar)|(bar(.|\n)*foo)
允许在其他两个模式{{ 1}}和foo
,以任意顺序使用任意一种模式。