【问题标题】:Regex: Extract IP and IPv6 from XML with SED [duplicate]正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]
【发布时间】: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>

【问题讨论】:

标签: xml sed busybox


【解决方案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

这将匹配IPv4IPv6 地址的模式并从数据中提取它

输出

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">schemas.xmlsoap.org/soap/envelope" s:encodingStyle="schemas.xmlsoap.org/soap/encoding"> ... '
  • @alex1452 您更改了提供的代码。您需要转义括号 \( \) 或使用 sed 扩展正则表达式 -E。您还在命令的g 标志之后添加了一个括号,这将不起作用。如果您完全按照提供的方式复制并粘贴代码而不做任何更改,它应该可以工作。
猜你喜欢
  • 2016-08-28
  • 2011-07-03
  • 2015-09-17
  • 2015-09-19
  • 2013-08-09
  • 2011-09-11
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
相关资源
最近更新 更多