为什么 grep 与其他正则表达式工具不一致?

为什么 grep 与其他正则表达式工具不一致?

我目前正在尝试编写一个 grep 命令来在其输入中查找 IP 地址。我的正则表达式是

\d+\.\d+\.\d+\.\d+

其工作符合预期在线测试员具有各种正则表达式。

但是,当我将其放入 grep 命令中(-o意味着输出匹配的文本本身,而不是整行)时,它会产生意想不到的结果。例如,

nslookup s4.moddedminecraft.club | grep -o "\d+\.\d+\.\d+\.\d+"

给出空输出。nslookup 命令的输出如下:

$ nslookup s4.moddedminecraft.club
Server:     1.1.1.1
Address:    1.1.1.1#53

Non-authoritative answer:
Name:   s4.moddedminecraft.club
Address: 46.4.20.113

当我将该输出放入链接的在线测试器时,它的行为符合预期,并匹配所有 IPv4 地址。为什么 grep 的行为不同?

$ grep -V
grep (GNU grep) 3.4
Copyright (C) 2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Mike Haertel and others; see
<https://git.sv.gnu.org/cgit/grep.git/tree/AUTHORS>.

答案1

  • grep 使用不支持的 POSIX 基本正则表达式\d
  • egrep 使用 POSIX 扩展正则表达式。
  • php 或 python 以及许多其他语言使用 PCRE。

使用 POSIX,您必须逃避+量词:

[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+

相关内容