glob 模式中“[--0]”的含义

glob 模式中“[--0]”的含义

我正在阅读有关“Glob”和“Globbing Pathnames”的内容,我发现这个奇怪的(对我来说)部分手册页:

“[--0]”匹配“-”、“.”、“0”这三个字符,因为“/”不能匹配。

我很困惑!两个破折号和一个0匹配怎么办.?角色在这里扮演什么角色/?这是手册页中的错误吗?

答案1

正如该段落开头所解释的那个手册页, '-' 特点,当放在两个字符之间时, 代表一系列字符,还有“-”字符,当作为括号之间的第一个或最后一个字符放置时,有其字面意义。因此,第一个破折号实际上表示“-”字符,第二个破折号是范围说明符。因此,整个模式由“-”和“0”之间的所有字符组成,在 C/POSIX 语言环境中(但通常不在其他语言环境中)是:

-
.
/
0

因为'/'无法匹配,该模式匹配三个字符“-”、“.”、“0”。

答案2

这与手册页本身无关:它是对 glob 模式语法的描述,您正在查看的手册页就是关于它的。

在 glob 模式中,括号分隔字符集。例如,[abc]匹配任何字符a,bc。该模式fo[abc]匹配foa, foband foc(但不匹配例如foo, or fo, or foab)。

括号内的字符-具有特殊含义:它用于形成字符范围。因此,该模式不是匹配0, -or ,而是匹配任何数字。范围可以与其他范围和单独的字符组合;例如在 ASCII 编码中匹配任何字母或下划线。9[0-9][A-Za-z_]

仅当在语法上合理时,减号才被解释为范围指示符:如果它是括号内的第一个或最后一个字符,或者如果它紧接在另一个范围之后,则-代表其自身。因此[--0],在 中,第一个-代表自身,第二个-是范围指示符,因此此模式匹配当前语言环境中-和之间的任何字符。0

在里面ASCII码编码,该范围涵盖以下 4 个字符:-, ., /, 0。该字符/不能出现在文件名中,因为它始终被解释为目录分隔符;因此该模式[--0]仅匹配 3 个字符-,.0

请注意,在 ASCII 以外的区域设置中,模式可以匹配不同的字符集。区域设置对字符范围的影响系统和应用程序之间存在一定的差异。

大多数正则表达式引擎对字符范围使用与 shell glob 模式相同的语法,但有两个区别:

  • 在 glob 模式中,如果左括号后的第一个字符是 a !,则该模式匹配所有字符不是在集合中。在正则表达式中,字符^起着相同的作用。一些 shell^也支持!.
  • 某些正则表达式变体允许\使下一个字符失去其特殊含义,例如[\[\]\-a]匹配[]或。在其他正则表达式变体和 glob 模式中,字符集中的反斜杠没有特殊含义。如果是在集合中,则它必须排在第一位(不可能指定空集合:是一个不完整的模式,匹配右括号或后面出现的任何字符)。-a][]

相关内容