*RE 开头的语义是什么?有记录(man 7 regex)它只匹配基本 RE *(即,它变成普通字符),但是扩展 RE 会发生什么?通过示例,它看起来与 '.*' 具有相同的语义,但我找不到任何来源。
prompt> echo "hello" | grep -E '*'
hello
prompt> echo "hello" | grep '*'
prompt>
Run Code Online (Sandbox Code Playgroud)
*+?{的
<asterisk>,<plus-sign>,<question-mark>,和<left-brace>应在括号表达式使用时除外特殊(见RE括号表达式)。以下任何使用都会产生未定义的结果:
- 如果先出现在ERE这些字符,或者紧跟一个
<vertical-line>,<circumflex>或<left-parenthesis>- 如果 a
<left-brace>不是有效区间表达式的一部分(请参阅ERE 匹配多个字符)
任何试图始终如一地解释在这种情况下会发生什么的尝试都将受到实施的支配。按照@kos 的回答,它们可能与空的正则表达式匹配。
请注意,echo "hello" | grep -E '*'返回hello是因为字符串匹配并grep返回整行,而不是因为*与 相同.*。你应该测试-Eo:
% echo "hello" | grep -Eo '*'
%
Run Code Online (Sandbox Code Playgroud)
我没有资料来支持这一点,但基于实际测试的一个不太疯狂的猜测表明,正则表达式开头的一系列量词只是被忽略了:
% echo "*hello" | grep -Eo '*'
% echo "+hello" | grep -Eo '+'
% echo "?hello" | grep -Eo '?'
% echo "{1}hello" | grep -Eo '{1}'
1}
% echo "***hello" | grep -Eo '***'
% echo "*+?{1}hello" | grep -Eo '*+?{1}hello'
1}hello
Run Code Online (Sandbox Code Playgroud)
如果返回值不同于0,我的提示会在行的开头添加返回值,因此这些都是匹配的。