我在包含数百个源代码文件的项目中搜索宏的定义。如何使用grep查找包含2个字符串的文件?
我相当肯定这些宏都是在单个文件中定义的。
如果我做了一个grep -r
搜索一个宏,超过1000个命中发生。
我想搜索每个文件,并找到包含这两个宏名称的文件。
这可以用grep来完成吗?
例如是这样的:
grep -r "MACRO1" AND "MACRO2" ./
我在包含数百个源代码文件的项目中搜索宏的定义。如何使用grep查找包含2个字符串的文件?
我相当肯定这些宏都是在单个文件中定义的。
如果我做了一个grep -r
搜索一个宏,超过1000个命中发生。
我想搜索每个文件,并找到包含这两个宏名称的文件。
这可以用grep来完成吗?
例如是这样的:
grep -r "MACRO1" AND "MACRO2" ./
用途:
grep -Pzrl "(?s)(MACRO1.+MACRO2\|MACRO2.+MACRO1)" ./
-P
Perl的正则表达式-z
改变换行符空字符。-r
递归-l
只打印文件名
(?s)
使得.
匹配换行符
MACRO1.+MACRO2
发现当MACRO1是MACRO2前MACRO2.+MACRO1
发现当MACRO2是MACRO1另一种方式是
grep -rlZ 'MACRO1' ./ | xargs -0 grep -l 'MACRO2'
grep -rlZ 'MACRO1' ./
会给含有MACRO1
-Z
是与空字符xargs -0 grep -l 'MACRO2'
会给文件名含有分离的文件名的文件名MACRO2
与GNU grep
:
grep -lrZ 'macro1' * |xargs -0 grep -l 'macro2'
它将打印同时包含宏的文件名。
nitpick:'-z'使用空字符作为分隔符而不是换行符...所以如果输入文件包含空字符,它将不会一次读取整个文件。 – Sundeep
@Sundeep:你说得对, – Toto