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
Regular Expressions/POSIX Basic Regular Expressions
角色等级
POSIX标准定义了一些类或字符类别,如下所示。这些类在括号中使用 。
我不明白字符类是什么,但是假设它是一个匹配任何空格的特殊字符,因此相信' s / [:space:] / _ g /'会匹配中间的空间" b"但是我认为' [:space:]'本身不匹配任何字符(如果仍然错误,请更正)。
我认为[:space:]就像' \ t \ n \ r \ n \ f \ v'但它本身没有任何功能。使用blacket' [[:space:]]',它具有与' [\ t \ n \ r \ f \ v]'相同的功能。
答案 0 :(得分:1)
您需要了解术语:
括号表达式是[
和]
中包含的一组字符,可以在regexp中使用。该组字符可以由以下任意组合(以及可选的初始^
否定字符)的任意组合表示:
abcd...z
或a-z
或[:lower:]
所以[:space:]
是一个字符类(代表所有空白字符),可以在regexp中的括号表达式[...]
中使用,就像你在括号内专门列出所有空格字符一样表达[...]
。所以这个:
[:space:]
只是一个字符类,而这个:
[[:space:]]
是一个括号表达式,包括所有空格字符,以及:
[[:space:][:lower:]_#;A-D]
是一个括号表达式,包括高大的空白字符加上所有小写字母加上字符_,#和;加上A到D范围内的字母(无论你的语言环境中有哪些字符)。