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

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

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

答案1

Shell 文件名通配常用表达使用一些相同的字符,并且它们具有相似的目的,但你是对的,它们不兼容。文件名通配是一个不太强大的系统。

在文件名通配中:

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

  • ?意思是“任何单个字符”

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

方括号 ( []) 在我正在输入此内容的系统上的两个系统中似乎工作相同,至少对于简单的情况是这样。这包括 POSIX 字符类(例如[:alpha:])之类的内容。也就是说,如果您需要命令在许多不同的系统类型上工作,我建议不要使用超出基本内容的任何内容,例如字符列表(例如[abeq])和字符范围(例如[a-c])。

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

答案2

回答原标题所表达的问题:

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

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

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

相关内容