0

星号或星号告诉引擎尝试匹配前面的令牌零次或多次。加号告诉引擎尝试一次或多次匹配前面的令牌。

根据定义,我想知道为什么加号返回的匹配项比星号多。

 echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]+"

返回

ABC DDD

 echo "ABC ddd kkk DDD" | grep -Eo "[A-Z]*"

返回 ABC

4

1 回答 1

5

据我所知,它没有。使用 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 岁;你能安装一个更新的版本吗?浏览ChangeLog2.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/并将其安装在您的主目录下(假设您的系统有一个工作编译器和相关工具)。

于 2013-08-21T18:15:31.340 回答