我有一个变量
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 :(得分: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)
$ 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