獲取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出了什麼問題
獲取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出了什麼問題
問題是.*
是貪婪的,所以它會匹配IP中的數字。你需要在IP之前的空間停下來。
如果sed
支持PCRE,你也可以使用非貪婪量詞.*?
,但它只有BRE和ERE。
如果沒有空格,您可以匹配任何非數字。但是您還需要允許IP位於字符串的開頭。
echo $my_var | sed -n "s/^\(\|.*[^0-9]\)\([0-9.]\+\):.*$/\2/p"
順便說一句,這是沒有必要逃避.
內[]
。
$ 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
正如沒有人指出來,沒有一個解決方案將作爲my_var只有字符串「你好」在它在此之前,該行會出錯,如: - 192.168.0.1:22:command not found。所以你可能想要在繼續任何嘗試之前解決這個問題 – grail