【发布时间】:2014-03-25 10:33:36
【问题描述】:
我正在编写一个 bash 脚本,我需要在其中从多个字符串中提取 IPv4 和 IPv6 地址范围,然后在保存到文件之前根据要求对其进行格式化。
我的正则表达式工作正常:http://regexr.com?38jsb(未优化,粗略添加)
但是,如果我使用 egrep 声明 egrep: repetition-operator operand invalid,使用 bash 会引发错误
这是我的 bash 脚本:
#!/bin/bash
regex="(?>(?>([a-f\d]{1,4})(?>:(?1)){3}|(?!(?:.*[a-f\d](?>:|$)){})((?1)(?>:(?1)){0,6})?::(?2)?)|(?>(?>(?1)(?>:(?1)){5}:|(?!(?:.*[a-f\d]:){6,})(?3)?::(?>((?1)(?>:(?1)){0,4}):)?)?(25[0-5]|2[0-4]\d|1\d{2}|[1-9]?\d)(?>\.(?4)){3}))\/\d{1,2}"
echo "v=abc ip4:127.0.0.1/19 ip4:192.168.1.1/32 ip4:192.168.2.50/20 ip6:2001:4860:4000::/36 ip6:2404:6800:4000::/36 ip6:2607:f8b0:4000::/36 ip6:2800:3f0:4000::/36 ip6:2a00:1450:4000::/36 ip6:2c0f:fb50:4000::/36 ~all" | egrep -o $regex
如何在 bash 中提取这两种类型的 IP 范围?有什么更好的解决方案?
注意:我将样本数据用于测试目的
【问题讨论】:
-
未经测试,但相当肯定
egrep不会与您正在使用的许多运算符/类一起使用(例如\d)。尝试使用grep -Po切换到 perl 风格的正则表达式。你也应该引用"$regex"。 -
不,那没用!还有其他建议吗?感谢您发布顺便说一句!
-
你在使用 GNU grep 吗?
-
我在 Mac OS X 上测试它。根据以下解决方案中的 cmets,似乎
-P在 OS X 上不起作用,这就是为什么我无法让它工作.但是我从@mklement0 那里得到了一个更好的解决方案。还是谢谢!