当我想要grep某些目录中的所有html文件时,我会执行以下操作
grep --include="*.html" pattern -R /some/path
效果很好.问题是如何grep某些目录中的所有html,htm,php文件?
从这个使用grep --exclude/ - include语法不grep通过某些文件,似乎我可以做到以下几点
grep --include="*.{html,php,htm}" pattern -R /some/path
但遗憾的是,这对我不起作用.
仅供参考,我的grep版本是2.5.1.
Ste*_*eve 122
您可以使用多个--include标志.这对我有用:
grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/
但是,您可以按照Deruijter建议执行操作.这对我有用:
grep -r --include=*.{html,php,htm} "pattern" /some/path/
不要忘记你可以使用find和xargs为这类事情:
find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
HTH
mkl*_*nt0 26
使用{html,php,htm}只能作为工作括号扩展,这是一个非标准的(不是POSIX兼容)功能bash,ksh和zsh.
换句话说:不要尝试在目标脚本中使用它/bin/sh- 在这种情况下使用显式多个--include参数.
grep本身并没有明白{...}的符号.
要识别大括号扩展,它必须是命令行上的未加引号(部分)令牌.
大括号扩展扩展为多个参数,因此在手头的情况下grep最终会看到多个 --include=...选项,就像您已经单独传递它们一样.
大括号扩展的结果受到globbing(文件名扩展)的影响,这有一些陷阱:
如果碰巧包含不带引号的 globbing元字符,如每个结果参数可以进一步扩展为匹配文件名*.
虽然这是不太可能有令牌,如--include=*.html(例如,你必须有一个文件字面上命名类似--include=foo.html的东西来匹配),这是值得铭记一般.
如果nullglobshell选项发生在(被打开shopt -s nullglob)和通配符匹配什么,参数会被丢弃.
因此,要获得完全可靠的解决方案,请使用以下命令:
grep -R '--include=*.'{html,php,htm} pattern /some/path
Run Code Online (Sandbox Code Playgroud)
'--include=*.'因单引号而被视为文字 ; 这可以防止无意中将其解释为通配符.*
{html,php,htm}, - 必要性 - 不带引号的大括号扩展[1]
,扩展为3个参数,由于{...} 直接跟随'...'令牌,它包含该令牌.
因此,在shell删除引号后,以下3个 文字参数最终传递给grep:
--include=*.html--include=*.php--include=*.htm[1]更准确地说,只有大括号扩展的语法相关部分必须不加引号,列表元素可能仍然是单独引用的,并且必须是如果它们包含可能在大括号扩展后导致不需要的通配的通配元字符; 虽然在这种情况下没有必要,但上述内容可以写成
'--include=*.'{'html','php','htm'}
尝试删除双引号
grep --include=*.{html,php,htm} pattern -R /some/path
Run Code Online (Sandbox Code Playgroud)
它的作用相同,但没有--include选择。它也适用于 grep 2.5.1。
grep -v -E ".*\.(html|htm|php)"
Run Code Online (Sandbox Code Playgroud)