我总是发现自己在UNIX中对这两个通配符的使用感到困惑。我理解星号只能用作regexp中的量词,但UNIX允许*
在某些情况下,如ls
命令,而在grep
中,它应该仅用作量词。有没有什么规则可以指导我使用哪一个呢?
您讨论的是UNIX中两种不同的模式,glob(通配符)和正则表达式。
Globs通常在匹配文件名时使用。您的shell在命令参数上自动执行通配符展开,这就是您可以编写
的方式。ls *foo*
列出包含字符串foo
的所有文件。Globs非常简单(忽略extglob
):语法通常只支持*
(任何字符)和?
(任何一个字符)。由于shell的自动扩展,这些可以在任何地方使用,必须显式地抑制以避免不必要的匹配(例如,写grep '.*foo.*'
以避免在模式中扩展*
)。
另一方面,我们有正则表达式,用于模式匹配文本。通常,它们与特定的实用程序一起使用,如grep
, sed
和perl
,它们理解这些模式,尽管一些shell具有接受regex的上下文(例如Bash的${x/pat/sub}
)。正则表达式语法要强大得多,这使得它非常适合在大量文本中查找特定模式。