星号或星号告诉引擎尝试匹配前面的令牌零次或多次。加号告诉引擎尝试一次或多次匹配前面的令牌。
根据定义,我想知道为什么加号返回的匹配项比星号多。
echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"
返回
ABC DDD
echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"
返回 ABC
据我所知,它没有。使用 GNU grep 版本 2.5.3、2.6.3、2.10 和 2.12,我得到:
$ echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"
ABC
DDD
$ echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"
ABC
DDD
请仔细检查您的第二个示例。如果您可以确认您只获得了一行输出,则可能是您的grep
. 如果您使用grep
的是 GNU ,输出是grep --version
什么?如果没有,您使用的是什么操作系统,以及(如果您知道)什么grep
实现?
更新 :
我刚刚从源代码构建并安装了 GNU grep 2.5.1(您正在使用的版本),并且我确认了您的输出。它似乎是那个版本中的一个错误grep
,显然在 2.5.1a 和 2.5.3 之间更正了。GNU grep 2.5.1 大约 12 岁;你能安装一个更新的版本吗?浏览ChangeLog
2.5.3,我怀疑这可能是修复:
2005-08-24 Charles Levert <charles_levert@gna.org>
* src/grep.c (print_line_middle): In case of an empty match,
make minimal progress and continue instead of aborting process
of the remainder of the line, in case there's still an upcoming
non-empty match.
* tests/foad1.sh: Add two tests for this.
* doc/grep.texi, doc/grep.1: Document this behavior, since
--only-matching and --color are GNU extensions which are
otherwise unspecified by POSIX or other standards.
即使您对正在使用的机器没有完全访问权限,您仍然应该能够从您的主目录下载源 tarballftp://ftp.gnu.org/gnu/grep/
并将其安装在您的主目录下(假设您的系统有一个工作编译器和相关工具)。