在Bash中,当您键入ls *.out
时,它将输出以.out
结尾的列表。这是一个正则表达式吗?linux grep“* .out”和ls * .out
如果是;当我echo a.out > test
,然后键入grep *.out test
,它什么都不输出。
是*
在ls中的*
在正则表达式中吗?
在Bash中,当您键入ls *.out
时,它将输出以.out
结尾的列表。这是一个正则表达式吗?linux grep“* .out”和ls * .out
如果是;当我echo a.out > test
,然后键入grep *.out test
,它什么都不输出。
是*
在ls中的*
在正则表达式中吗?
默认情况下,grep会查找精确表达式,而不是正则表达式,但您可以通过添加-E
标志来告诉它查找正则表达式。
因此,我认为,你要找的是什么grep -E *.out test
虽然研究在网络上一点点就已经给你你想要的东西;)
如果你想在.out
结尾的所有文件进行搜索,试试grep <string> *.out
。您可能还想了解globbing。
要理解的主要问题是您的shell正在扩展程序参数(传递给main
执行程序的功能)。阅读猛砸章关于shell expansions(和globbing)
所以,你不应该键入ls "*.out"
只是ls *.out
那么/bin/ls
程序开始与扩张*.out
。举例来说,如果你有文件a.out
,b.out
,,a.c
的*.out
(由shell完成)的扩展a.out
b.out
所以/bin/ls
得到"ls"
"a.out"
"b.out"
"cc.out"
其次NULL
其char**argv
第二个参数,它main
,与第一int argc
参数是4.
但grep
确实想要一些regular expression或“regexp”。你一般要引用它(避免 shell来尝试它的扩展)。
这是一个可扩展的文件名描述的外壳,所以在这两个ls *.out
和grep *.out test
壳填充文件名的命令行,命令本身只能看到所产生的名字的名单。假设你有文件名为foo.out
和bar.out
,这些命令将相当于这些:
ls bar.out foo.out
grep bar.out foo.out test
第一个要求ls
列出文件,第二个要求grep命令来查找模式bar.out
中的文件foo.out
和test
。后者可能不是你想要的东西,所以引用模式的grep为:
grep "*.out" test
除了这是不是一个真正的有效的正则表达式。在文件名中,星号*
匹配零个或多个字符,在正则表达式中它匹配零个或多个前一项(括号中的字符,字符组或表达式),但在行首没有任何字符,所以表达毫无意义。 Perl抱怨说,grep
和sed
不这样做,但它们似乎也不匹配任何东西。
在正则表达式中,点.
表示任何字符,因此需要从字面上进行转义。而且,grep会在行中的任何位置找到匹配项,因此可以省略前导.*
(它可以匹配任意数量的任何字符)。因此,这将查找包含字符串.out
文件test
在行:
grep "\.out" test
正如我们看到的,被Bash和grep的使用模式(正则表达式)中使用的模式是不一样的。见例如Bash's manual for the pattern matches used in filename expansion和man page regex(7)
for regular expressions。还要注意,正则表达式有不同的方言,它们并不完全相容。
检查这些帖子:http://stackoverflow.com/questions/23702202/what-are-the-differences-between-glob-style-pattern-and-regular-expression和http://stackoverflow.com/questions/19673427 /正则表达式之间的差异 – codeforester
谢谢,这听起来是我的盟友。 – suoyong