![如何匹配字符串之间和下一个空格之前的所有内容](https://linux22.com/image/100381/%E5%A6%82%E4%BD%95%E5%8C%B9%E9%85%8D%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B9%8B%E9%97%B4%E5%92%8C%E4%B8%8B%E4%B8%80%E4%B8%AA%E7%A9%BA%E6%A0%BC%E4%B9%8B%E5%89%8D%E7%9A%84%E6%89%80%E6%9C%89%E5%86%85%E5%AE%B9.png)
假设我有以下字符串:
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])'