试图理解为什么 grep 手册用一个方括号来说明字符类。
https://www.gnu.org/software/grep/manual/html_node/Character-Classes-and-Bracket-Expressions.html
例如,它指出:使用 [:lower:] 匹配小写。然而在终端中,我使用它,结果是:
$ grep [:lower:] test
grep: character class syntax is [[:space:]], not [:space:]
我在尝试使用/理解本手册时遇到了无数问题,它有什么问题吗?它似乎只适用于双 [[]],但没有任何解释说明为什么手册说只使用 []。
因为这样的字符类只有一组括号。您只需要将它们也放在括号表达式中,这意味着最后您有两组。
该手册首先给出括号表达式的上下文,这个表达式周围有括号:
以下段落假定该上下文。
两个字符和一个连字符也需要放在括号内,即整个内容是
[a-f]
,而不仅仅是a-f
。(*)字符类也包含在方括号表达式中,例如,字符类
[:upper:]
包含在方括号中以给出方括号表达式[[:upper:]]
。或者,如果您在方括号中放置了不止一个字符类,您可以使用[-[:upper:][:digit:]]
匹配破折号、大写字母或数字的字符类。(单个括号表达式中的一个普通字符和两个字符类。)至于为什么语法是这样的,我不知道。
请注意,该手册甚至包含有关如何使用字符类的完整示例:
它说:
还描述了您收到的错误消息:
所以,它看起来真的不像是在告诉整个交易只使用一组括号。
除了......的例子
[:alnum:]
(并且[:alpha:]
是相似的):这是错误的。
[0-9A-Za-z]
与 相同[[:alnum:]]
,不是[:alnum:]
。[:alnum:]
会是0-9A-Za-z
,但两者都需要外括号来做任何有用的事情。当然,错误消息似乎也没有提到字符类和括号表达式之间的区别,所以是的,它们在那里有点不清楚。
请注意,由于括号在 shell 中也是 glob 字符,因此您应该引用模式,例如
否则,模式将由 shell 扩展为
:
,e
,l
,o
,r
, 或w
,如果存在任何具有这些确切名称的文件。(* 请注意,注意事项适用于字符范围,它们的解释取决于语言环境,以及 Bash 中的
globasciiranges
选项,我认为它已被证明表现得很奇怪。)