我在包含數百個源代碼文件的項目中搜索宏的定義。如何使用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