如何指定匹配模式,同时排除文件名中包含 PATTERN 的某些文件

如何指定匹配模式,同时排除文件名中包含 PATTERN 的某些文件

笔记:我已经根据我之前发布的内容更新了这个问题,因此有些答案可能与我想要问的不符。

我想在子目录中的一组文件中搜索一些文本,同时想跳过文件名中包含“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,则可以使用findgrep 生成文件列表:

$ grep 'whatever_you_want_to_find' $(find wherever_you_want_to_search -not -iregex 'whatever_you_want_to_ignore')

相关内容