关于shell:如何对多种文件类型使用grep –include选项?

how do I use the grep --include option for multiple file types?

当我想对某个目录中的所有HTML文件进行grep时,我会执行以下操作

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

这很有效。问题是如何在某个目录中对所有HTML、HTM、PHP文件进行grep?

从使用grep--exclude/--include语法到不通过某些文件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/

但是,您可以按照Deruijter的建议进行操作。这对我很有用:

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

别忘了,你可以用findxargs来处理这类事情:

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

高温高压


使用{html,php,htm}只能用作支撑扩展,这是bashkshzsh的非标准(不符合posix)功能。

  • 换句话说:不要在针对/bin/sh的脚本中使用它——在这种情况下,使用显式的多个--include参数。

  • grep本身不理解{...}符号。

要识别大括号扩展,它必须是命令行上的一个无引号(A的一部分)标记。

大括号扩展到多个参数,因此在现有的情况下,grep最终会看到多个--include=...选项,就像您单独传递它们一样。

大括号扩展的结果将服从globbing(文件名扩展),它有以下缺陷:

  • 如果每个产生的参数恰好包含未加引号的全局元字符(如*),则可以进一步扩展到匹配的文件名。虽然这对于像--include=*.html这样的令牌来说是不太可能的(例如,为了匹配某些东西,您必须有一个文件,字面上命名为--include=foo.html这样的文件),但总的来说,这是值得记住的。

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

因此,对于完全可靠的解决方案,请使用以下内容:

1
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'}


尝试删除双引号

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


这不管用吗?

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


试试这个。-r将进行递归搜索。-s将取消显示"找不到文件"错误。-n将显示找到模式的文件的行号。

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


它的作用是相同的,但没有--include选项。它也适用于grep 2.5.1。

1
grep -v -E".*\.(html|htm|php)"


使用grepfind命令

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

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