正则表达式开头的“*”有什么作用?

正则表达式开头的“*”有什么作用?

在本例中讨论: find (GNU findutils) 4.5.11 grep (GNU grep) 2.20

假设我有一个包含一堆文件的目录。我想找到名为 jtobdops02.key 和 jtobdops.02.cer 的文件。

find . -regextype posix-extended -regex ".*jtobdops02\.(key|cer)"

给出:

./certs/jtobdops02.key

./certs/jtobdops02.cer

find . -type f | grep -E '.*jtobdops02.*(key|cer)'

还按预期给出:

./certs/jtobdops02.key

./certs/jtobdops02.cer

然而

find . -type f | grep -E '*jtobdops02.*(key|cer)'

给出这个:

./证书/jtobdops02.key

./证书/jtobdops02.cer

find 的人指出:

This is a match on the whole path, not a search.

grep 的 man 指出:

grep, egrep, fgrep - print lines matching a pattern

如果它们都进行匹配而不是搜索,为什么后者 grep 仍然有效?同样在后一种情况下,grep 没有前面的子表达式可以匹配,那么*在这种情况下匹配什么?彩色(粗体)输出没有显示任何差异,所以我认为它什么也没做。这种情况下不应该报错吗?

其中哪一项是特质,哪一项是其他工具和语言的通用做法?

答案1

以 an 开头的扩展正则表达式*将产生未定义的结果, 根据POSIX 标准

这是grepOpenBSD 6.4 上的情况:

$ grep -E '*hello'
grep: repetition-operator operand invalid

GNUgrep似乎完全忽略了*

$ printf 'hello\n' | ggrep -E '*hello'
hello

根据相同标准,如果使用基本正则表达式(grep不带-E),则*表达式或子表达式的开头处\(...\)(或紧接在首字母 后面^)将是解释为字面意思*

相关内容