3

这是 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): 等等,等等,...

但这不起作用:

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

我正在使用 GNU grep2.16 版。

4

3 回答 3

3

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

但是,要在(and and ) 中发生大括号扩展,您必须具有:bashkshzsh

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

  • 或者,由两个端点组成的一系列..项目,用;分隔 例如,{1..3}扩展为3 个参数1、、、23

因此,对于单个项目,根本不要使用大括号扩展

--include=\*.py

如果您确实需要考虑多个扩展,例如*.py文件*.pyc,这里有一个健壮的表单来说明底层的 shell 特性:

'--include=*.'{py,pyc}

这里:

  • 应用大括号扩展因为{...}包含 2 项列表。
  • 由于{...} 直接跟在文字(单引号)字符串--include=*.之后,大括号扩展的结果包括文字部分。
  • 因此,最终将2 个参数传递给grep,其文字内容如下:
    • --include=*.py
    • --include=*.pyc
于 2017-05-22T18:54:39.493 回答
2

由于大括号“{}”,您的命令失败。它将在文件名中搜索它。您可以创建一个诸如“myscript.{py}”之类的文件来说服自己。你会看到它会出现在结果中。

正确的选项参数将是'*.py'或等效的\*.py。无论哪种方式都可以保护它不被外壳(错误)解释。

另一方面,我只能建议对此类工作使用命令 find :

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

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

于 2017-05-22T18:16:46.713 回答
1

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

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

.根本不支持您的大\*.{py} 括号扩展用法。有关此问题的完整调查,请参阅下面的评论。作为记录,将这个答案归咎于由此产生的支撑战争;)grep

顺便说一句,大括号扩展在 Bash 中通常可以正常工作。有关更多详细信息,请参阅mklement0 答案


确认。作为替代方案,您可以考虑ack从现在开始改用。它是一个类似 的工具grep,但针对程序员进行了全面优化。

它非常适合您正在做的事情。关于它的一个很好的报价

每隔一段时间就会有一些事情会大大改善一个想法,你不能忽视它。这样的事情是ackgrep替换。

于 2017-05-22T18:04:51.573 回答