我试图通过使用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/'
请参见这个在线演示。