我如何使用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/
但是,你可以像Deruijter
build议的那样做。 这适用于我:
grep -r --include=*.{html,php,htm} "pattern" /some/path/
不要忘了你可以使用find
和xargs
这种事情:
find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
尝试删除双引号
grep --include=*.{html,php,htm} pattern -R /some/path
使用{html,php,htm}
只能作为大括号扩展 ,这是bash
, ksh
和zsh
的非标准(不符合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}
使用grep
和find
命令
find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f -exec grep PATTERN {} \+
你也可以使用-regex
和-regextype
选项。