how do I use the grep --include option for multiple file types?
当我想对某个目录中的所有HTML文件进行grep时,我会执行以下操作
这很有效。问题是如何在某个目录中对所有HTML、HTM、PHP文件进行grep?
从使用grep--exclude/--include语法到不通过某些文件grep,我似乎可以执行以下操作
但遗憾的是,这对我来说是行不通的。仅供参考,我的grep版本是2.5.1。
您可以使用多个
但是,您可以按照
别忘了,你可以用
高温高压
使用
换句话说:不要在针对
/bin/sh 的脚本中使用它——在这种情况下,使用显式的多个--include 参数。grep 本身不理解{...} 符号。
要识别大括号扩展,它必须是命令行上的一个无引号(A的一部分)标记。
大括号扩展到多个参数,因此在现有的情况下,
大括号扩展的结果将服从globbing(文件名扩展),它有以下缺陷:
如果每个产生的参数恰好包含未加引号的全局元字符(如
* ),则可以进一步扩展到匹配的文件名。虽然这对于像--include=*.html 这样的令牌来说是不太可能的(例如,为了匹配某些东西,您必须有一个文件,字面上命名为--include=foo.html 这样的文件),但总的来说,这是值得记住的。如果恰好打开了
nullglob shell选项(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]更准确地说,只有括号扩展的语法相关部分必须不加引号,列表元素仍然可以单独引用,并且如果它们包含可能导致括号扩展后不需要的换行的换行元字符,则必须单独引用;在这种情况下,虽然不需要这样做,但上述内容可以写为
尝试删除双引号
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} |
它的作用是相同的,但没有
1 | grep -v -E".*\.(html|htm|php)" |
使用
1 2 | find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f -exec grep PATTERN {} \+ |
您也可以使用