使用sed从一个字符串中检索IP地址

时间:2017-06-28 23:27:31

标签: regex bash sed

我有一个变量

my_var=Hello 192.168.0.1:22 World

我想从变量中检索此IP,我将sed命令写为

echo $my_var | sed -n "s/.*\([0-9\.]\+\):.*$/\1/p"

我希望得到"192.168.0.1"作为回报。相反,我得到了"1"

有人可以帮助我吗?我的sed有什么问题

2 个答案:

答案 0 :(得分:1)

问题是.*是贪婪的,所以它会匹配IP中的数字。你需要让它停在IP之前的空间。

echo $my_var | sed -n "s/.* \([0-9.]\+\):.*$/\1/p"

如果sed支持PCRE,您可以使用非贪婪量词.*?,但它只有BRE和ERE。

如果没有空格,您可以匹配任何非数字。但是您还需要允许IP位于字符串的开头。

echo $my_var | sed -n "s/^\(\|.*[^0-9]\)\([0-9.]\+\):.*$/\2/p"

顺便说一句,没有必要在.内逃避[]

答案 1 :(得分:0)

bash parameter expansion

$ r='Hello 192.168.0.1:22 World'
$ # remove upto first space
$ echo "${r#* }"
192.168.0.1:22 World
$ s="${r#* }"
$ # remove from first : to end of line
$ echo "${s%%:*}"
192.168.0.1

使用awk

$ # space or : is input delimiter
$ echo "$r" | awk -F'[ :]' '{print $2}'
192.168.0.1