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