我如何使用grep –include选项来处理多种文件types?

当我想grep某些目录中的所有html文件时,我执行以下操作

grep --include="*.html" pattern -R /some/path

这工作得很好。 问题是如何grep所有的HTML,HTM,PHP文件在某些​​目录?

从这个使用grep –exclude / – 包括语法不通过某些文件grep ,似乎我可以做到以下几点

grep --include="*.{html,php,htm}" pattern -R /some/path

但可悲的是,这对我不起作用。
仅供参考,我的grep版本是2.5.1。

你可以使用多个--include标志。 这适用于我:

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

但是,你可以像Deruijterbuild议的那样做。 这适用于我:

grep -r --include=*.{html,php,htm} "pattern" /some/path/

不要忘了你可以使用findxargs这种事情:

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"

HTH

尝试删除双引号

 grep --include=*.{html,php,htm} pattern -R /some/path 

使用{html,php,htm}只能作为大括号扩展 ,这是bashkshzsh的非标准(不符合POSIX标准)特性。

  • 换句话说:不要试图在一个以/bin/sh目标的脚本中使用它 – 在这种情况下使用显式的多个--include参数。

  • grep本身不理解{...}表示法。

要识别大括号扩展,它必须是命令行上未加引号 (部分)的标记

括号扩展扩展为多个参数 ,所以在这种情况下, grep最终会看到多个 --include=...选项,就像您单独传递它们一样。

大括号扩展的结果受制于globbing(文件名扩展) ,其具有缺陷

  • 每个结果参数可以进一步扩展为匹配的文件名,如果它恰好包含未引用的通配符元素(如*
    虽然这不太可能像--include=*.html这样的标记(例如,你必须有一个字面上的文件命名为 --include=foo.html的东西来匹配),值得记住的是一般。

  • 如果nullglob shell选项恰好被打开( shopt -s nullglob )并且globbing不匹配,则参数将被丢弃

因此,要获得完全可靠的解决scheme ,请使用以下内容:

 grep -R '--include=*.'{html,php,htm} pattern /some/path 
  • '--include=*.' 由于被单引号而被视为文字 ; 这可以防止无意中将*解释为通配符。

  • {html,php,htm} ,必要的 – 不加引号的括号扩展[1]扩展为3个参数,由于{...} 直接跟在'...'标记之后包含该标记。

  • 因此,在shell删除引号之后, 下面的3个 文字参数最终被传递给了grep

    • --include=*.html
    • --include=*.php
    • --include=*.htm

[1]更准确地说,只有大括号扩展的语法相关部分必须不加引号, 列表元素仍然可以被单独引用,并且必须是包含通配符的元字符,这些元字符可能导致大括号扩展之后不需要的通配符; 虽然在这种情况下不需要,以上可以写成
'--include=*.'{'html','php','htm'}

这是不是工作?

  grep pattern /some/path/*.{html,php,htm} 

尝试这个。 -r将执行recursionsearch。 -s将会禁止找不到文件的错误。 -n会显示find该模式的文件的行号。

  grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h} 

使用grepfind命令

 find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f -exec grep PATTERN {} \+ 

你也可以使用-regex-regextype选项。