正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]
Posted
技术标签:
【中文标题】正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]【英文标题】:Regex: Extract IP and IPv6 from XML with SED [duplicate] 【发布时间】:2021-11-26 22:09:45 【问题描述】:我想使用 sed 从包含的 XML 字符串中提取 IP4 和 IPv6 地址。不幸的是,该脚本将在使用busybox(OpenWRT)的系统上运行。因此,我无法访问可以使事情变得更容易的完整 grep。我正在努力为 sed 提供正确的字符串,专门用于提取第一个 XML 和第二个 XML 之间的测试。有人可以帮忙吗?
<?xml version="1.0" encoding="utf-8"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:GetExternalIPAddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"> <NewExternalIPAddress>12.116.116.39</NewExternalIPAddress> </u:GetExternalIPAddressResponse> </s:Body> </s:Envelope>
<?xml version="1.0" encoding="utf-8"?> <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <s:Body> <u:X_AVM_DE_GetExternalIPv6AddressResponse xmlns:u="urn:schemas-upnp-org:service:WANIPConnection:1"> <NewExternalIPv6Address>2341:9e8:601b:797d:cece:1eff:fedb:75f2</NewExternalIPv6Address> <NewPrefixLength>64</NewPrefixLength> <NewValidLifetime>258993</NewValidLifetime> <NewPreferedLifetime>172593</NewPreferedLifetime> </u:X_AVM_DE_GetExternalIPv6AddressResponse> </s:Body> </s:Envelope>
【问题讨论】:
Don't Parse XML/html With Regex. 我建议使用 XML/HTML 解析器 (xmlstarlet, xmllint ...)。 【参考方案1】:使用sed
$ sed 's/.*>\([0-9]\1,3\\.[0-9]\1,3\\.[0-9]\1,3\\.[0-9]\1,3\\|[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\\)<.*/\1/g' input_file
这将匹配IPv4
或IPv6
地址的模式并从数据中提取它
输出
12.116.116.39
2341:9e8:601b:797d:cece:1eff:fedb:75f2
【讨论】:
很抱歉我无法让它工作:'ipv6=$(curl "http://$gateway:49000/igdupnp/control/WANIPConn1" deleted* - s | sed 's/.*>([0-9]\1,3\\.[0-9]\1,3\\.[0-9]\1,3\ \.[0-9]\1,3\\|[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a -z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\:[0-9a-z]\ 1,4\:[0-9a-z]\1,4\:[0-9a-z]\1,4\)<. xml ip version="1.0" encoding="utf-8">\( \)
或使用 sed 扩展正则表达式 -E
。您还在命令的g
标志之后添加了一个括号,这将不起作用。如果您完全按照提供的方式复制并粘贴代码而不做任何更改,它应该可以工作。以上是关于正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 linux shell 中使用正则表达式从文件中提取 IP 地址?