我总是发现自己对UNIX中这两个通配符的使用感到困惑。
我理解星号只能用作正则表达式中的量词,但UNIX在某些情况下允许*
,例如ls
命令,而在grep
中,它只能用作量词。是否有一些规则可以指导我使用哪一个?
答案 0 :(得分:9)
你在谈论UNIX中两种不同的模式, glob (通配符)和正则表达式。
通常在匹配文件名时使用Globs。你的shell在命令参数上自动进行通配符扩展,这就是你可以写的方式
ls *foo*
列出包含字符串foo
的所有文件。 Glob非常简单(忽略extglob
):语法通常只支持*
(任何字符)和?
(任何一个字符)。由于shell的自动扩展,这些可以在任何地方使用,必须明确禁止以避免不必要的匹配(例如,写grep '.*foo.*'
以避免扩展模式中的*
。
另一方面,我们有正则表达式,用于模式匹配文本。通常,这些用于特定的实用程序,例如grep
,sed
和perl
,它们理解这些模式,尽管有些shell具有采用正则表达式的上下文(例如Bash的${x/pat/sub}
)。正则表达式语法功能更强大,因此非常适合查看特定模式的大量文本。