shell 如何对多个文件类型使用grep --include选项?

1aaf6o9v  于 2022-11-16  发布在  Shell
关注(0)|答案(7)|浏览(193)

当我想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。

kq0g1dla

kq0g1dla1#

您可以使用多个--include标志。

grep -r --include=*.html --include=*.php --include=*.htm "pattern" /some/path/

但是,您可以使用Deruijter suggested

grep -r --include=*.{html,php,htm} "pattern" /some/path/

别忘了,您也可以使用findxargs来处理这类事情:

find /some/path/ -name "*.htm*" -or -name "*.php" | xargs grep "pattern"
h6my8fg2

h6my8fg22#

tl;dr

# Works in bash, ksh, and zsh.
grep -R '--include=*.'{html,php,htm} pattern /some/path

使用**{html,php,htm}只能用作大括号扩展**,这是bashkshzsh的非标准(不符合POSIX)功能。

  • 换句话说就是:不要尝试在以/bin/sh为目标的脚本中使用它-在这种情况下使用 explicit 多个--include参数。
    *grep本身 * 不 * 理解{...}表示法。

若要辨识大括号展开,它必须是命令列上的 * 未加引号 (的一部分)词语基元*。
大括号扩展
扩展为 * 多个参数***,因此在本例中,grep最终会看到 * 多个 * --include=...选项,就像您分别传递它们一样。
大括号扩展的结果会受到globbing(文件名扩展)的影响,这有陷阱

  • 如果每个结果参数碰巧包含 unquoted globbing元字符(如*),则可以进一步扩展为匹配的文件名。

虽然这对于像--include=*.html这样的标记来说是不太可能的(例如,您必须有一个文件 * 字面上命名为 * 类似于--include=foo.html的东西才能匹配),但通常值得记住。

  • 如果碰巧打开了nullglob shell选项(shopt -s nullglob),并且globbing匹配 nothing,则该参数将被 * 丢弃 *。

因此,对于完全稳健的解决方案,请使用以下内容:

grep -R '--include=*.'{html,php,htm} pattern /some/path
  • '--include=*.'被视为 * 文字 *,因为它是 * 单引号 *;这防止了将*无意地解释为globbing字符。
  • {html,php,htm},- of necessary- unquoted 大括号扩展[1],扩展到 3 个参数,由于{...} * 直接跟随'...'标记 包括 * 该标记。
  • 因此,在shell删除引号后,以下 *3literal* 参数最终将传递给grep**:
  • --include=*.html
  • --include=*.php
  • --include=*.htm

[1]更准确地说,只有大括号扩展的 * 语法相关 * 部分必须取消引用,* 列表元素 * 仍然可以单独引用,并且如果它们包含可能导致大括号扩展后出现不必要的通配符的通配符,则必须单独引用;尽管在这种情况下不是必需的,但是上述内容可以被写为
'--include=*.'{'html','php','htm'}

htzpubme

htzpubme3#

请尝试删除双引号

grep --include=*.{html,php,htm} pattern -R /some/path
2ledvvac

2ledvvac4#

它的作用是相同的,但没有--include选项。它也适用于grep 2.5.1。

grep -v -E ".*\.(html|htm|php)"
93ze6v8z

93ze6v8z5#

这不管用吗?

grep pattern  /some/path/*.{html,php,htm}
relj7zay

relj7zay6#

试试这个。-r将执行递归搜索。-s将隐藏文件未找到错误。-n将显示找到模式的文件的行号。

grep "pattern" <path> -r -s -n --include=*.{c,cpp,C,h}
dzjeubhm

dzjeubhm7#

grepfind命令配合使用

find /some/path -name '*.html' -o -name '*.htm' -o -name '*.php' -type f 
 -exec grep PATTERN {} \+

您也可以使用-regex-regextype选项。

相关问题