使用--include选项运行grep时出现奇怪的问题

时间:2017-05-22 17:58:07

标签: bash shell grep brace-expansion

这是bash shell的代码。应该如何指定文件掩码,如果不是这样的话?我希望这两个命令能够找到搜索表达式,但它没有发生。在这个例子中,我事先知道我更喜欢将搜索限制为python源代码文件,因为不合格的搜索是愚蠢的时间浪费。

所以,这可以按预期工作:

grep -rni '/home/ga/projects' -e 'def Pr(x,u,v)'
  

/home/ga/projects/anom/anom.py:27:def Pr(x,u,v):blah,blah,...

但这不起作用:

grep --include=\*.{py} -rni '/home/ga/projects' -e 'def Pr(x,u,v)'

我正在使用GNU grep版本2.16。

3 个答案:

答案 0 :(得分:3)

--include=\*.{py}看起来像 破坏的尝试使用大括号扩展 未加引号 {{ 1}}表达式。

然而,brace expansion  要发生在{...}(以及bashksh),您必须拥有:

  • 至少2个项目的列表,以zsh分隔;例如,,扩展为 2 参数,{py,txt}py

  • 范围由两个端点组成的项目,以txt分隔;例如,..,扩展为 3 参数,{1..3}12

因此,使用单个项,只是不使用大括号扩展

3

如果您确实需要考虑多个扩展程序,例如--include=\*.py 以及*.py文件,这里有一个强大的表单,用于说明底层的shell功能:

*.pyc

下面:

  • 已应用,因为'--include=*.'{py,pyc} 包含一个2项列表。
  • 由于{...} 直接遵循 literal (单引号)字符串{...},因此括号扩展的结果包括文字部分。
  • 因此, 2 参数最终会传递给--include=*.,其中包含以下 literal 内容:
    • grep
    • --include=*.py

答案 1 :(得分:2)

由于大括号' {}&#39>,您的命令失败。它将在文件名中搜索它。您可以创建一个文件,例如' myscript。{py}'说服自己。您会看到它会显示在结果中。

正确的选项参数为'*.py'或等效的\*.py。无论哪种方式都可以保护它免受shell的错误解释。

另一方面,我只建议使用命令find来完成这些工作:

find /home/ga/projects -regex '.*\.py$' -exec grep -e "def Pr(x,u,v)" {} +

这将保护您免受难以理解的shell行为。

答案 2 :(得分:1)

尝试这样做(使用引号是安全的;也比反斜杠更好的可读性逃避恕我直言):

grep --include='*.py' ...

\*.{py} 所有不支持grep 大括号扩展使用情况。grep。有关此问题的完整调查,请参阅下面的评论。为了记录,责备this answer产生的大括号战争;)

顺便说一句,支撑扩展在Bash中工作得很好。有关详细信息,请参阅mklement0 answer

<强>确认即可。作为替代方案,您可以考虑从现在开始切换到ack。它就像ack一样,但完全针对程序员进行了优化。

这非常适合你正在做的事情。关于它的一个很好的引用

  

每隔一段时间出现一些能够改善想法的东西,你就不能忽视它。这样的事情是grepformatter = logging.Formatter('%(message)s %(asctime)s.%(msecs)03d %(levelname)s', datefmt='%H:%M:%S') 替代。