这是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。
答案 0 :(得分:3)
--include=\*.{py}
看起来像 破坏的尝试使用大括号扩展 (未加引号 {{ 1}}表达式。
然而,brace expansion
要发生在{...}
(以及bash
和ksh
),您必须拥有:
至少2个项目的列表,以zsh
分隔;例如,
,扩展为 2 参数,{py,txt}
和py
。
或范围由两个端点组成的项目,以txt
分隔;例如,..
,扩展为 3 参数,{1..3}
,1
和2
。
因此,使用单个项,只是不使用大括号扩展:
3
如果您确实需要考虑多个扩展程序,例如--include=\*.py
以及*.py
文件,这里有一个强大的表单,用于说明底层的shell功能:
*.pyc
下面:
'--include=*.'{py,pyc}
包含一个2项列表。{...}
直接遵循 literal (单引号)字符串{...}
,因此括号扩展的结果包括文字部分。--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
一样,但完全针对程序员进行了优化。
这非常适合你正在做的事情。关于它的一个很好的引用:
每隔一段时间出现一些能够改善想法的东西,你就不能忽视它。这样的事情是
grep
,formatter = logging.Formatter('%(message)s %(asctime)s.%(msecs)03d %(levelname)s', datefmt='%H:%M:%S')
替代。