星号或星号告诉引擎尝试将前一个标记匹配零次或多次。加号告诉引擎尝试匹配前一个令牌一次或多次。
根据定义,我想知道为什么加号会返回比星号更多的匹配。
echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"
返回
ABC DDD
echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"
返回 ABC
答案 0 :(得分:4)
据我所知,事实并非如此。使用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
中的错误。如果您使用的是GNU grep
,那么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.
即使您没有对正在使用的计算机拥有完全访问权限,您仍然可以从ftp://ftp.gnu.org/gnu/grep/
下载源tarball并将其安装在您的主目录下(假设您的系统正常运行)编译器和相关工具)。