k.Cyborg Asked: 2022-07-07 07:47:30 +0800 CST2022-07-07 07:47:30 +0800 CST 2022-07-07 07:47:30 +0800 CST 如何使用正则表达式从字符串中获取所有数字和 IP? 772 假设我有以下示例字符串: <ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP> 我想以以下格式提取第一个数字 和IP : 0 10.0.100.10 我确实知道如何提取第一个 ( sed 's@^[^0-255]*\([0-255]\+\).*@\1@') 号码和 IP ( grep -oE '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'),但当时有一个,我想知道我是否可以在一行中实现它 grep sed 3 个回答 Voted redseven 2022-07-07T08:05:34+08:002022-07-07T08:05:34+08:00 将所有非数字(而不是“。”)字符替换为空格,然后您可以打印出第一列和第二列: echo '<ETH0_IP><![CDATA[10.0.100.10]]></ETH0_IP>' | \ sed -re 's;[^0-9.]; ;g' | \ awk '{print $1,$2}' 输出: 0 10.0.100.10 ps:如果你有“。”,你必须让它更复杂。其他地方,而不仅仅是IP。 Best Answer ilkkachu 2022-07-07T08:30:45+08:002022-07-07T08:30:45+08:00 如果您想要所有(整数)数字和所有 IP(v4) 地址,请使用 grep 在正则表达式中添加一个替代: ... | grep -oE '[0-9]+|[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' 这将每行打印一个值,当然也会0从ETH0末尾捕获。 如果您只需要输入行中包含与上述类似结构(而不是其他结构)的数字和 IP,您可以使用例如 sed: ... | sed -nEe 's,.*<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>.*,\1 \2,p' \1并\2对应括号中的第一组和第二组,[0-9.]+为了清晰和懒惰,我将IP与这里匹配。 或在 Perl 中类似: ... | perl -ne 'print "$1 $2\n" if m,<ETH([0-9]+)_IP><!\[CDATA\[([0-9.]+)\]\]></ETH[0-9]+_IP>,' Kusalananda 2022-07-07T08:44:25+08:002022-07-07T08:44:25+08:00 使用xq(来自https://kislyuk.github.io/yq/),并假设输入实际上是问题中的单个 XML 节点: xq -r 'to_entries[] | [ (.key|ltrimstr("ETH")|rtrimstr("_IP")), .value ] | @tsv' file.xml ETH这会将 XML 文档转换为 JSON,然后通过从开头和_IP结尾剥离来从标记名称中提取其余部分。还会提取 IP 地址,并将两个结果值作为制表符分隔的列表输出。 ltrimstr()andrtrimstr()调用可能会被gsub("[^[:digit:]]"; ""))or替换,这gsub("\\D"; ""))将从标签名称中删除所有非数字。 中间 JSON 文档看起来像 { "ETH0_IP": "10.0.100.10" } ...最后的输出将是 0 10.0.100.10
将所有非数字(而不是“。”)字符替换为空格,然后您可以打印出第一列和第二列:
输出:
ps:如果你有“。”,你必须让它更复杂。其他地方,而不仅仅是IP。
如果您想要所有(整数)数字和所有 IP(v4) 地址,请使用 grep 在正则表达式中添加一个替代:
这将每行打印一个值,当然也会
0
从ETH0
末尾捕获。如果您只需要输入行中包含与上述类似结构(而不是其他结构)的数字和 IP,您可以使用例如 sed:
\1
并\2
对应括号中的第一组和第二组,[0-9.]+
为了清晰和懒惰,我将IP与这里匹配。或在 Perl 中类似:
使用
xq
(来自https://kislyuk.github.io/yq/),并假设输入实际上是问题中的单个 XML 节点:ETH
这会将 XML 文档转换为 JSON,然后通过从开头和_IP
结尾剥离来从标记名称中提取其余部分。还会提取 IP 地址,并将两个结果值作为制表符分隔的列表输出。ltrimstr()
andrtrimstr()
调用可能会被gsub("[^[:digit:]]"; ""))
or替换,这gsub("\\D"; ""))
将从标签名称中删除所有非数字。中间 JSON 文档看起来像
...最后的输出将是