Unix正则表达式中的星号(*)和点星号(.*)

8

我经常会被UNIX中这两个通配符的使用弄得迷惑不解。我知道星号在regexp里只能用作量词,但是UNIX有些情况下可以使用*,比如ls命令中,然而在grep命令中,它只能用作量词。是否有一些规则可以指导我何时使用它们呢?


5
你对 regexglob 感到困惑。 - Boris the Spider
1个回答

11

你在谈论UNIX中的两种不同的模式,一种是通配符(glob),另一种是正则表达式(regular expression)。

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

ls *foo*

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

另一方面,我们有正则表达式,用于匹配文本。通常,这些与特定实用程序一起使用,如grepsedperl,它们了解这些模式,尽管一些shell具有接受正则表达式的上下文(例如Bash的${x/pat/sub})。正则表达式语法更加强大,这使其非常适合查找特定模式的大量文本。


这解释得非常清楚!感谢您花时间写下这个详细的答案。 - toddlermenot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接