2017-05-14 67 views
0

在Bash中,当您键入ls *.out时,它将输出以.out结尾的列表。这是一个正则表达式吗?linux grep“* .out”和ls * .out

如果是;当我echo a.out > test,然后键入grep *.out test,它什么都不输出。

*在ls中的*在正则表达式中吗?

+1

检查这些帖子:http://stackoverflow.com/questions/23702202/what-are-the-differences-between-glob-style-pattern-and-regular-expression和http://stackoverflow.com/questions/19673427 /正则表达式之间的差异 – codeforester

+0

谢谢,这听起来是我的盟友。 – suoyong

回答

0

默认情况下,grep会查找精确表达式,而不是正则表达式,但您可以通过添加-E标志来告诉它查找正则表达式。

因此,我认为,你要找的是什么grep -E *.out test虽然研究在网络上一点点就已经给你你想要的东西;)

+0

谢谢,但是直接在前的*没有什么,'*'真的匹配了什么? – suoyong

+3

不,默认情况下'grep'寻找与基本正则表达式(BRE)的匹配,'grep -F'(或'fg​​rep')查找固定字符串,并且'grep -E'(或'egrep')寻找扩展的正则表达式。 GNU grep的手册页提到了简单的区别:http://man7.org/linux/man-pages/man1/grep.1.html – ilkkachu

1

如果你想在.out结尾的所有文件进行搜索,试试grep <string> *.out。您可能还想了解globbing

1

要理解的主要问题是您的shell正在扩展程序参数(传递给main执行程序的功能)。阅读猛砸章关于shell expansions(和globbing

所以,你不应该键入ls "*.out"只是ls *.out那么/bin/ls程序开始与扩张*.out。举例来说,如果你有文件a.outb.out,​​,a.c*.out(由shell完成)的扩展a.outb.out​​所以/bin/ls得到"ls""a.out""b.out""cc.out"其次NULLchar**argv第二个参数,它main,与第一int argc参数是4.

grep确实想要一些regular expression或“regexp”。你一般要引用它(避免 shell来尝试它的扩展)。

0
  1. 对于grep命令,*表示0或更多的prev /前面的字符或表达式的出现。所以在你的情况下,grep .out* test可以工作,因为它会查找.ou后面跟零个或多个文件测试中任何字符的出现。

  2. 对于ls命令,ls *.out意味着列出所有以其名称结尾的文件/文件夹,其名称为.out

+0

正则表达式'.out *'会在任何字符之后寻找'ou' ,例如''回合',''''或'〜ou'(它也会匹配任何数量的't's之后,但与常规grep,这意味着什么。) – ilkkachu

+0

谢谢ikkikachu!这更有意义。我会编辑我的答案。 – YunujD

1

这是一个可扩展的文件名描述的外壳,所以在这两个ls *.outgrep *.out test壳填充文件名的命令行,命令本身只能看到所产生的名字的名单。假设你有文件名为foo.outbar.out,这些命令将相当于这些:

ls bar.out foo.out 
grep bar.out foo.out test 

第一个要求ls列出文件,第二个要求grep命令来查找模式bar.out中的文件foo.outtest 。后者可能不是你想要的东西,所以引用模式的grep为:

grep "*.out" test 

除了这是不是一个真正的有效的正则表达式。在文件名中,星号*匹配零个或多个字符,在正则表达式中它匹配零个或多个前一项(括号中的字符,字符组或表达式),但在行首没有任何字符,所以表达毫无意义。 Perl抱怨说,grepsed不这样做,但它们似乎也不匹配任何东西。

在正则表达式中,点.表示任何字符,因此需要从字面上进行转义。而且,grep会在行中的任何位置找到匹配项,因此可以省略前导.*(它可以匹配任意数量的任何字符)。因此,这将查找包含字符串.out文件test在行:

grep "\.out" test 

正如我们看到的,被Bash和grep的使用模式(正则表达式)中使用的模式是不一样的。见例如Bash's manual for the pattern matches used in filename expansionman page regex(7) for regular expressions。还要注意,正则表达式有不同的方言,它们并不完全相容。