我经常会被UNIX中这两个通配符的使用弄得迷惑不解。我知道星号在regexp里只能用作量词,但是UNIX有些情况下可以使用*
,比如ls
命令中,然而在grep
命令中,它只能用作量词。是否有一些规则可以指导我何时使用它们呢?
你在谈论UNIX中的两种不同的模式,一种是通配符(glob),另一种是正则表达式(regular expression)。
当匹配文件名时,通常使用通配符。您的shell会自动对命令参数进行通配符扩展,这就是您可以编写的方式。
ls *foo*
列出包含字符串foo
的所有文件。通配符非常简单(忽略extglob
):语法通常仅支持*
(任意字符)和?
(任意一个字符)。由于shell的自动扩展,这些通配符可以在任何地方使用,并且必须明确地禁止扩展以避免不想要的匹配(例如编写grep '.*foo.*'
来避免扩展模式中的*
)。
另一方面,我们有正则表达式,用于匹配文本。通常,这些与特定实用程序一起使用,如grep
、sed
和perl
,它们了解这些模式,尽管一些shell具有接受正则表达式的上下文(例如Bash的${x/pat/sub}
)。正则表达式语法更加强大,这使其非常适合查找特定模式的大量文本。
regex
和glob
感到困惑。 - Boris the Spider