2011-03-11 295 views
7

一直试图让这个工作一段时间,并没有真正完全得到它。 基本上,我有一个IP地址的文件,每天更改或更少。该文件只包含一个IP地址,这是我试图用我疯狂的grepping来取代我的当前内部IP地址。使用sed来搜索并替换文件中的ip地址

我有这个

#!/bin/sh 

newip=$(ifconfig | grep 0xfff | grep -Eo '([0-9]{1,3}\.){3}[0-9]{1,3}' | grep -v 255) 

echo $newip 
sed 's/*\.*\.*\.*/"$newip"/g' log.txt > logmod.txt 

,但它不匹配和更换。 我对sed并不熟悉,我也是一个初学者,也有正则表达式。

任何帮助将会很棒! 谢谢:)

回答

11

如果你的的sed版本支持扩展正则表达式(在-r选项),你可以做这样的事情(这类似于你在你的grep声明的)。另请注意,$newip位于单引号之外,以允许shell替换它。

sed -r 's/(\b[0-9]{1,3}\.){3}[0-9]{1,3}\b'/$newip/ 

顺便说一句,这个解决方案仍然匹配不代表IP地址的字符串。请参阅this siteIP地址更复杂的解决方案。

+0

被告知,“\ b “(字边界)构造不是标准的。 – 2011-03-11 19:28:47

+0

@Steve:的确如此。我用** GNU sed version 4.2.1 **测试了这个表达式。由于OP添加了'bash'标签,我认为他可能也有一些版本的** GNU sed **。另请注意,我特别提到'-r'选项。 – 2011-03-11 19:33:43

+0

你,我的朋友,救了我很多小时的压力!我的sed版本并不幸运地支持-r,所以我使用了自制软件(我使用的是Mac)并安装了完美运行的最新版本! – twistedpixel 2011-03-11 19:37:57

1
IP=207.0.0.2; [[ x${IP}x =~ x"(2([0-4][0-9])|2(5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(2([0-4][0-9])|2(5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(2([0-4][0-9])|2(5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])\.(2([0-4][0-9])|2(5[0-5])|1[0-9][0-9]|[1-9][0-9]|[0-9])"x ]] && echo ok || echo bad 

这仅验证四个小数八位表示 所以这一块会失败016.067.006.200 (即使是有效的,但不是四个十进制八位字节表示,但八进制)

016.067.006.200 =~ 14.55.6.200