我正在寫一個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