如何匹配字符串之间和下一个空格之前的所有内容

如何匹配字符串之间和下一个空格之前的所有内容

假设我有以下字符串:

sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret 

我想提取“192.168.1.1”或任何其他有效的 IP 地址(四个十进制数,每个数字的范围从 0 到 255,用点分隔,例如 172.16.254.1)

似乎最简单的方法是匹配字符串“-ip”和下一个空格之前(192.168.1.1 和 sdfdf 之间的空格)之间的所有内容。

我试过:

sed -e 's/-s \(.*\)[[:space:]]/\1/'

但没用

答案1

截至目前,您的问题是“如何从字符串 '-ip ' 提取到下一个空格?”。以下命令回答了这个问题。

sed -e 's/^.*-ip \([^ ]*\) .*$/\1/'

它的工作原理本质上是“任意数量的非空格字符”:[^ ]*

$ echo "sdf sfdi -ip 192.168.1.1 sdf eret" | sed -e 's/^.*-ip \([^ ]*\) .*$/\1/' 192.168.1.1

答案2

假设 GNU grep

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+'
192.168.1.1

并将其限制为仅有效的 IP 地址,因此字符串由 4 组数字分隔.,其中没有一个超过 255(我不处理,<0因为-首先不会匹配):

$ echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE '[0-9.]+' | 
    awk -F. '{for(i=1;i<=NF;i++){if(NF!=4||$i>255){next}}}1;'
192.168.1.1

答案3

使用 GNU grep:

echo 'sdffsd sfdfi -ip 192.168.1.1 sdfdf ertret' | grep -oE "([0-9]{1,3}[\.]){3}[0-9]{1,3}"

输出:

192.168.1.1

答案4

忘记sed。这是提取可能的 IP(v4) 地址的方法:

egrep -o '\b([0-9][0-9]?[0-9]?\.){3}[0-9][0-9]?[0-9]?\b'

要获取绝对有效的 IP 地址(即没有超过 255 的数字),请将上述命令通过管道输入:

egrep -v '([3-9][0-9][0-9]|2[6-9][0-9]|25[6-9])'

相关内容