2011-03-11 338 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