2017-06-28 44 views
1

獲取IP地址,我有一個變量用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出了什麼問題

+0

正如沒有人指出來,沒有一個解決方案將作爲my_var只有字符串「你好」在它在此之前,該行會出錯,如: - 192.168.0.1:22:command not found。所以你可能想要在繼續​​任何嘗試之前解決這個問題 – grail

回答

1

問題是.*是貪婪的,所以它會匹配IP中的數字。你需要在IP之前的空間停下來。

如果sed支持PCRE,你也可以使用非貪婪量詞.*?,但它只有BRE和ERE。

如果沒有空格,您可以匹配任何非數字。但是您還需要允許IP位於字符串的開頭。

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

順便說一句,這是沒有必要逃避.[]

+0

我運行命令echo $ my_var | sed -n「s/^ \(\ |。* [^ 0-9] \)\([0-9。] \ + \):。* $/\ 2/p」 「 – Neil

+0

你說得對我很貪心」。*「這給了我想要的東西。 ####### echo $ my_var | sed -n「s/[^ 0-9] * \([0-9 \。] \ + \):。* $/\ 1/p」#######。謝謝! – Neil

+0

如果在IP之前有號碼,則不起作用,例如'my_var =「123hello 192.168.0.1:22」' – Barmar

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