*
RE 开头的语义是什么?有文档记录 (人 7 正则表达式) 它只匹配基本 RE *
(即,它变成普通字符),但对于扩展 RE 会发生什么?通过示例,它看起来具有与 '.*' 相同的语义,但我找不到任何来源。
prompt> echo "hello" | grep -E '*'
hello
prompt> echo "hello" | grep '*'
prompt>
答案1
*+?{
、、、和 应为特殊符号
<asterisk>
,<plus-sign>
但用于括号表达式时除外(请参阅<question-mark>
<left-brace>
RE 括号表达式)。以下任何一种使用方式都会产生未定义的结果:
- 如果这些字符首先出现在 ERE 中,或者紧跟在
<vertical-line>
、<circumflex>
或之后<left-parenthesis>
- 如果 a
<left-brace>
不是有效区间表达式的一部分(参见匹配多个字符的 ERE)
任何试图一致解释这种情况发生的情况的尝试都将取决于实现。根据@kos的回答,它们可能匹配空的正则表达式。
答案2
请注意,因为字符串匹配,所以echo "hello" | grep -E '*'
返回整行,而不是因为与相同而返回。您应该使用进行测试:hello
grep
*
.*
-Eo
% echo "hello" | grep -Eo '*'
%
我没有资料来支持这一点,但是根据实际测试得出的不太大胆的猜测表明,正则表达式开头的量词序列被忽略了:
% 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
如果返回值不同于0
,我的提示会将返回值添加到行首,因此这些都是匹配的。
答案3
显示grep -E 'regex'
包含匹配的正则表达式的行并以红色突出显示匹配项。
考虑到这一点,grep -E '*'
将显示所有包含零个或多个“(无)”的行。
grep '*'
只会显示其中有星号的线条。