sed分组中缺少字符

  • 本文关键字:字符 sed shell sed
  • 更新时间 :
  • 英文 :


我试图通过使用sed分组从字符串中获得IP,我不知道这是什么问题。

输入:

echo "instream(10.20.213.11@40266):" | sed -E 's/.*([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/1/'

输出:

0.20.213.11

为什么第一个数字不见了?

您可以将匹配.*替换为在随后的数字匹配regex部分之前需要非数字字符的.*[^0-9]:

sed -E 's/.*[^0-9]([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/1/'

它将工作,因为IP地址在你的字符串不是在字符串的开始。

查看在线演示:

#!/bin/bash
echo "instream(10.20.213.11@40266):" | 
sed -E 's/.*[^0-9]([0-9]+.[0-9]+.[0-9]+.[0-9]+).*/1/'
# => 10.20.213.11

如果你的IP地址可以在字符串的开头,你可以使用

sed -E 's/(.*[^0-9]|^)([0-9]+(.[0-9]+){3}).*/2/'

查看这个在线演示。在这里,(.*[^0-9]|^)匹配任何文本直到最右边的非数字或字符串的开始。现在,IP地址匹配模式将降落在组2中,因此在替换(RHS)中使用2

如果您的sed支持词边界,请考虑使用词边界:

sed -E 's/.*b([0-9]+(.[0-9]+){3})b.*/1/'

请参见这个在线演示。

相关内容

  • 没有找到相关文章

最新更新