我正在写一个bash脚本,我需要从多个字符串中提取IPv4和IPv6地址范围,然后在保存到文件之前根据需求对其进行格式化。提取Bash中的IPv4和IPv6地址范围?
我已经得到了正则表达式做工精细:http://regexr.com?38jsb(不优化,大致增加)
然而,在bash它抛出,如果我有egrep
其中规定egrep: repetition-operator operand invalid
这里是我的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”'。 – BroSlow
不,那没用!还有其他建议吗?感谢您发布btw! –
你在使用GNU grep吗? – BroSlow