正则表达式:使用 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

这将匹配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 标志之后添加了一个括号,这将不起作用。如果您完全按照提供的方式复制并粘贴代码而不做任何更改,它应该可以工作。

以上是关于正则表达式:使用 SED 从 XML 中提取 IP 和 IPv6 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式和 sed 提取分支名称?

如何在 linux shell 中使用正则表达式从文件中提取 IP 地址?

在 Python 中使用正则表达式从特定 xml 标记中提取特定值 [重复]

正则表达式从字符串中提取 IP 地址 [重复]

使用 sed 或 Perl 来注释 XML 块的正则表达式

正则表达式。如何从xml文档中提取值[关闭]