包含多种文件类型的选项?

当我想要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/

但是,您可以按照Deruijter建议进行操作。 这适用于我:

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不匹配,则参数将被丢弃。

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

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

    链接地址: http://www.djcxy.com/p/47241.html

    上一篇: include option for multiple file types?

    下一篇: How can I search for a multiline pattern in a file?