在Bash中,当您键入ls *.out
时,它将输出以.out
结尾的列表。这是正则表达式吗?
如果是;当我echo a.out > test
然后输入grep *.out test
时,它不输出任何内容。
正则表达式中的*
与*
相同吗?
答案 0 :(得分:1)
如果您要搜索以.out
结尾的所有文件,请尝试grep <string> *.out
。
您也可以阅读globbing。
答案 1 :(得分:1)
要理解的主要是你的shell正在扩展程序参数(传递给执行程序的main
函数)。阅读关于shell expansions(和globbing)
因此,您不应该输入ls "*.out"
而只需ls *.out
,然后/bin/ls
程序会以*.out
的扩展启动。例如,如果您有文件a.out
,b.out
,cc.out
,a.c
*.out
(由shell完成)的扩展为a.out
b.out
cc.out
因此/bin/ls
得到"ls"
"a.out"
"b.out"
"cc.out"
后跟NULL
char**argv
} main
的第二个参数,第一个int argc
参数为4。
但grep
确实需要一些regular expression或“regexp”。您通常要引用它(避免 shell尝试扩展)。
答案 2 :(得分:1)
它是扩展文件名为globs的shell,所以在ls *.out
和grep *.out test
中,shell将文件名填充到命令行,并且命令本身只看到结果列表名。假设您有名为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
除了那不是真正有效的正则表达式。在文件名字符串中,星号*
匹配零个或多个字符,在正则表达式中它匹配前一个项目的零个或多个(括号中的字符,字符组或表达式),但是在行的开头没有&#39 ; t any,所以表达没什么意义。 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。另请注意,有不同的正则表达方言,彼此之间并不完全相容。
答案 3 :(得分:0)
默认情况下,grep会查找确切的表达式,而不是正则表达式,但您可以通过添加-E
标志来指示它查找正则表达式。
所以我认为你所寻找的是grep -E *.out test
,虽然对网络的一点点研究会给你你想要的东西;)
答案 4 :(得分:0)
对于grep命令,*表示上一个/前一个字符或表达式出现0或更多。因此,在您的情况下,grep .out* test
将起作用,因为它将查找.ou
的出现,然后在文件测试中出现0或更多的任何字符。
对于ls命令,ls *.out
表示列出以.out
结尾的所有文件/文件夹。