2014-12-27 251 views

回答

5

由於sed不支持負向預測聲明,所以我建議你使用Perl而不是sed。

perl -pe 's/\b(?:(?!127\.0\.0\.1)\d{1,3}(?:\.\d{1,3}){3})\b/'"$ip"'/g' file 

例子:

$ cat file 
122.54.23.121 
127.0.0.1 125.54.23.125 
$ ip="101.155.155.155" 
$ perl -pe 's/\b(?:(?!127\.0\.0\.1)\d{1,3}(?:\.\d{1,3}){3})\b/'"$ip"'/g' file 
101.155.155.155 
127.0.0.1 101.155.155.155 

哈克一個通過PCRE動詞(*SKIP)(*F)

$ perl -pe 's/\b127\.0\.0\.1\b(*SKIP)(*F)|\b\d{1,3}(?:\.\d{1,3}){3}\b/'"$ip"'/g' file 
101.155.155.155 
127.0.0.1 101.155.155.155 
+0

你能解釋一下哈克嗎? – Eric 2014-12-27 14:02:20

+0

@Eric更新.. – 2014-12-27 14:29:28

+0

非常感謝你的工作! – 2014-12-31 11:23:28

2

假設你有這樣的事情在你的文件my_file

127.0.0.1 192.152.30.1 
158.30.254.1 127.0.0.1 
158.40.253.10 127.0.0.1 

你可以試試下面

sed -r 's/127.0.0.1/########/g;s/[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}/MY_NEW_IP/g;s/########/127.0.0.1/g' my-file 

在命令行中,我假設你有沒有像########在文件

採取一切127.0.0.1########替換它,然後針對所有IP地址,您將取代新IP。隨後用127.0.0.1

結果

127.0.0.1 MY_NEW_IP 
MY_NEW_IP 127.0.0.1 
MY_NEW_IP 127.0.0.1 

更換########如果你正在替換變量確保您的雙引號

sed -r "................................." my_file 
2

使用標準的Unix工具這裏是一個awk版本:

awk -v ip='aa.bb.cc.dd' '{for (i=1; i<=NF; i++) 
     if ($i != "127.0.0.1" && $i ~ /\<[0-9]{1,3}(\.[0-9]{1,3}){3}\>/) $i=ip} 1' file 
127.0.0.1 aa.bb.cc.dd 
aa.bb.cc.dd 127.0.0.1 
aa.bb.cc.dd 127.0.0.1 

cat file 
127.0.0.1 192.152.30.1 
158.30.254.1 127.0.0.1 
158.40.253.10 127.0.0.1