当我想grep某个目录中的所有html文件时,我执行以下操作grep --include="*.html" pattern -R /some/path
这很好用。问题是如何grep某个目录中的所有html,htm,php文件?
从这个Use grep --exclude/--include syntax to not grep through certain files看来,我可以做以下事情grep --include="*.{html,php,htm}" pattern -R /some/path
但遗憾的是,这对我不起作用。
仅供参考,我的grep版本是2.5.1。
7条答案
按热度按时间kq0g1dla1#
您可以使用多个
--include
标志。但是,您可以使用Deruijter suggested。
别忘了,您也可以使用
find
和xargs
来处理这类事情:h6my8fg22#
tl;dr
使用**
{html,php,htm}
只能用作大括号扩展**,这是bash
、ksh
和zsh
的非标准(不符合POSIX)功能。/bin/sh
为目标的脚本中使用它-在这种情况下使用 explicit 多个--include
参数。*
grep
本身 * 不 * 理解{...}
表示法。若要辨识大括号展开,它必须是命令列上的 * 未加引号 (的一部分)词语基元*。
大括号扩展扩展为 * 多个参数***,因此在本例中,
grep
最终会看到 * 多个 *--include=...
选项,就像您分别传递它们一样。大括号扩展的结果会受到globbing(文件名扩展)的影响,这有陷阱:
*
),则可以进一步扩展为匹配的文件名。虽然这对于像
--include=*.html
这样的标记来说是不太可能的(例如,您必须有一个文件 * 字面上命名为 * 类似于--include=foo.html
的东西才能匹配),但通常值得记住。nullglob
shell选项(shopt -s nullglob
),并且globbing匹配 nothing,则该参数将被 * 丢弃 *。因此,对于完全稳健的解决方案,请使用以下内容:
'--include=*.'
被视为 * 文字 *,因为它是 * 单引号 *;这防止了将*
无意地解释为globbing字符。{html,php,htm}
,- of necessary- unquoted 大括号扩展[1],扩展到 3 个参数,由于{...}
* 直接跟随'...'
标记 , 包括 * 该标记。grep
**:--include=*.html
--include=*.php
--include=*.htm
[1]更准确地说,只有大括号扩展的 * 语法相关 * 部分必须取消引用,* 列表元素 * 仍然可以单独引用,并且如果它们包含可能导致大括号扩展后出现不必要的通配符的通配符,则必须单独引用;尽管在这种情况下不是必需的,但是上述内容可以被写为
'--include=*.'{'html','php','htm'}
htzpubme3#
请尝试删除双引号
2ledvvac4#
它的作用是相同的,但没有
--include
选项。它也适用于grep 2.5.1。93ze6v8z5#
这不管用吗?
relj7zay6#
试试这个。-r将执行递归搜索。-s将隐藏文件未找到错误。-n将显示找到模式的文件的行号。
dzjeubhm7#
将
grep
与find
命令配合使用您也可以使用
-regex
和-regextype
选项。