7

我总是发现自己对 UNIX 中这两个通配符的用法感到困惑。我知道星号只能用作正则表达式中的量词,但 UNIX*在某些情况下允许像ls命令一样,而在grep它应该只用作量词。是否有一些排除可以指导我使用其中的哪一个?

4

1 回答 1

10

您正在谈论 UNIX 中的两种不同的模式,即glob(通配符)和正则表达式

匹配文件名时通常使用 Glob。您的 shell 会自动对命令参数进行通配符扩展,您可以这样编写

ls *foo*

列出所有包含字符串的文件foo。Glob 非常简单(忽略extglob):语法通常只支持*(任何字符)和?(任何一个字符)。由于 shell 的自动扩展,这些可以在任何地方使用,并且必须明确禁止以避免不必要的匹配(例如,编写grep '.*foo.*'以避免扩展*模式中的 )。

另一方面,我们有正则表达式,用于对文本进行模式匹配。通常,它们与特定的实用程序一起使用,例如grep,sed并且perl理解这些模式,尽管一些 shell 具有采用正则表达式的上下文(例如 Bash's ${x/pat/sub})。正则表达式语法更强大,这使得它非常适合在大量文本中查找特定模式。

于 2013-03-10T12:53:39.330 回答