正则表达式与用于过滤文件的通配符有何不同


15

虽然我们*用来表示零个或多个前面的字符grep,但是*.c当我们将它与ls类似的命令一起使用时,我们会查找所有C文件ls *.c。有人能说出*这两种情况下使用的不同吗?

Answers:


30

Shell文件名的通配符正则表达式使用一些相同的字符,它们具有相似的用途,但是您是对的,它们不兼容。文件名遍历功能不那么强大。

在文件名中:

  • * 表示“零个或多个字符”

  • ? 表示“任何单个字符”

但是在正则表达式中,您必须使用.*“零个或多个字符”来表示,并.表示“任何单个字符”。A ?在正则表达式中的含义完全不同:零个或前面RE元素的一个实例。

[]在我键入此代码的系统上,方括号()似乎在两个系统中均相同,至少在简单情况下如此。这包括POSIX字符类之类的东西(例如[:alpha:])。就是说,如果您需要命令在许多不同的系统类型上运行,则建议不要使用除基本功能之外的任何功能,例如字符列表(例如[abeq])和字符范围(例如[a-c])。

这些差异意味着两个系统仅在简单情况下可以直接互换。如果需要文件名的正则表达式匹配,则需要另一种方法。find -regex是一种选择。(请注意,find -name顺便说一句,它也使用glob语法。)


2
我不知道它被称为globbing :)
user3539 2012年

3
此外,还有各种正则表达式。并非所有正则表达式都创建相同!并且您还有许多其他模式匹配系统,例如SQL like,其中'%'means '*'
李斯特先生,2012年

4
regexp的两种主要风味是POSIX和PCRE(与Perl兼容的RE)。后者不太麻烦,并且具有更多功能。Unix工具和外壳程序通常使用POSIX,大多数带有内置正则表达式的编程语言(外壳程序除外)使用PCRE。在线阅读材料时,请当心区别。
goldilocks 2012年

11

回答原始标题中表达的问题:

为什么正则表达式与用于过滤文件的正则表达式不同?

文件名扩展早于大多数操作系统中已经存在的正则表达式(通配符/小丑字符),并且比后者更简单直观。

虽然*.txt休闲用户很容易理解,但是类似.*\.txt的东西更适合有经验的用户/程序员,更不用说^.*\.txt$...


2
“为什么”部分的另一个原因是:速度。正则表达式比较慢:pastebin.com/3iNCgkE3
manatwork 2013年

3
*.txt不等于.*\.txt,它(主要)等于,.*\.txt$因为在.txt(至少假设合理的文件名遍历之后)之后什么也没有。也许甚至^.*\.txt$取决于使用情况。证明你的观点?
CVn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.