![为什么 grep 与其他正则表达式工具不一致?](https://linux22.com/image/1620261/%E4%B8%BA%E4%BB%80%E4%B9%88%20grep%20%E4%B8%8E%E5%85%B6%E4%BB%96%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F%E5%B7%A5%E5%85%B7%E4%B8%8D%E4%B8%80%E8%87%B4%EF%BC%9F.png)
我目前正在尝试编写一个 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]\+