sed 为什么 POSIX blacket 表达式需要在另一个 blacket 中?

sed why POSIX blacket expression needs to be in another blacket?

问题

POSIX 表达式如 [:space:] 需要在另一个 [ ] 中的原因是什么?

$ echo "a b c" | sed 's/[:space:]*/_/g'
_ _b_ _

$ echo "a b c" | sed 's/[[:space:]]*/_/g'
_a_b_c_

$ echo "a b c" | sed 's/[[:space:]][[:space:]]*/_/g'
a_b_c

更新

正则 Expressions/POSIX 基本正则表达式

Character classes
The POSIX standard defines some classes or categories of characters as shown below. These classes are used within brackets.

我不明白字符 类 是什么,但假设它是一个匹配任何白色 space 的特殊字符,因此相信 's/[:space:]/_g/' 会匹配 space -在 "a b" 之间,但我认为 '[:space:]' 本身不会匹配任何字符(如果仍然错误,请更正)。

我想 [:space:] 就像 '\t\n\r\f\v' 但它本身没有任何功能。使用blacket'[[:space:]]',它就具有与'[\t\n\r\f\v]'相同的功能。

您需要了解术语:

方括号表达式 是一组包含在[] 中的字符,可以在正则表达式中使用。该组字符可以由以下任意组合(以及可选的初始 ^ 否定字符)表示:

  1. 一个字符列表,例如abcd...z,或
  2. 一个字符范围,例如a-z,或
  3. 一个字符class,例如[:lower:]

所以 [:space:] 是一个字符 class(代表所有白色 space 字符)并且可以在正则表达式的括号表达式 [...] 中使用,就像 if您特别列出了括号表达式 [...] 中的所有白色 space 字符。所以这个:

[:space:]

只是一个字符class,而这个:

[[:space:]]

是一个括号表达式,其中包括所有白色 space 字符和这个:

[[:space:][:lower:]_#;A-D]

是一个括号表达式,它包括高大的白色 space 字符加上所有小写字母加上字符 _、# 和 ;加上 A 到 D 范围内的字母(无论这些字符在您的语言环境中是什么)。