笔记:我已经根据我之前发布的内容更新了这个问题,因此有些答案可能与我想要问的不符。
我想在子目录中的一组文件中搜索一些文本,同时想跳过文件名中包含“svn”的某些文件的结果。
我怎样才能做到这一点?
答案1
细节取决于您到底想做什么,但是消极的环视可能有帮助。某些正则表达式语言(包括 PCRE)支持这一点。您可以grep
使用开关激活 PCRE -P
,因此根据您正在寻找的特定模式,您也许可以用它们做一些巧妙的事情,但这不太可能值得付出努力。
然而,阅读您的更新后,有更好的方法可以做到这一点。grep
提供-exclude
选项:
--exclude=GLOB
Skip files whose base name matches GLOB (using wildcard
matching). A file-name glob can use *, ?, and [...] as
wildcards, and \ to quote a wildcard or backslash character
literally.
所以,你可以简单地做
grep -Inr TEXT --exclude='*.svn' dir/
答案2
无法同时进行正向搜索 ( grep
) 和负向搜索 ( grep -v
)。另一种方法是使用-E
(或egrep
,这是同一件事) 并提供一个匹配的正则表达式,该正则表达式将匹配一个字符串,但不匹配另一个字符串。
答案3
如果您发现需要对 grep 提供的文件进行更复杂的控制--exclude
,则可以使用find
grep 生成文件列表:
$ grep 'whatever_you_want_to_find' $(find wherever_you_want_to_search -not -iregex 'whatever_you_want_to_ignore')