使用时ls | grep *e*
提供的结果比ls | grep e
小得多,为什么会如此呢?它们不是相同的命令。任何人都知道这些命令之间的区别。
答案 0 :(得分:0)
不,他们是不同的。与
ls | grep *e*
和ls | grep e
的命令不一样吗?
$ ls | grep *e*
命令shell 扩展模式*e*
以匹配当前目录中包含字母e
的所有文件。然后将此扩展文件列表传递给grep
命令:
$ ls
Hello.txt Null.txt Sample.txt
执行时
$ ls | grep *e*
实际命令为ls | grep Hello.txt Sample.txt
用
$ ls | grep e
没有文件名扩展,实际命令为ls | grep e
。
另见
如果要在不扩展的情况下传递参数,则需要引用它:
$ ls | grep "*e*"
然后,该命令实际上将ls | grep *e*
("*e*"
作为argv[1]
传递给grep命令。)
请注意,shell扩展与正则表达式不同 - shell匹配*
的任何字符串,而正则表达式*
表示前一个表达式的任何数字都应该出现。
答案 1 :(得分:0)
shell在执行命令之前展开*e*
。因此,如果您有名为beer
和free
的文件,则最终会在beer
中抓取free
,并忽略来自ls
的输入。
*e*
不是有效的正则表达式。 *
表示"前面的表达式中的零个或多个"并且在第一个实例中没有前面的表达式。正确地,grep
应该显示错误,但不是。它最终匹配没有重复零次或多次,然后e
重复零次或多次。因为每个可以想象的输入都包含零个或多个e
次出现,所以最终会匹配每个输入行。
但无论如何,如上所述,grep
不会看到此输入,因为它被shell拦截和扩展。如果你想按字面意思使用*
,你需要引用它。
ls | grep '.*e.*'
只是一种非常蹩脚的说法
ls | grep 'e'
因为前导通配符和尾随通配符不会添加任何值 - grep
始终在每个输入行的任何位置查找匹配项。
您真正想要的是使用shell的通配符匹配功能:
ls *e*
glob表达式*e*
不是正则表达式,而是glob模式。它做了你显然期望的事情。