2012-10-29 36 views
-1

我正在將一個文件中的192.168.XXX的每個實例更改爲192.168.yyy。在使用bash腳本的網絡配置文件中。掛我的事是我不知道xxx會是什麼。例如,它可以是192.168.122.1或192.168.123.1。也可能是192.168.122.2或192.168.122等,我認爲這可以用一個命令完成。用bash腳本更改子網

這裏是默認的網絡文件:

<network> 
     <name>default</name> 
     <bridge name="virbr0" /> 
     <forward/> 
     <ip address="192.168.122.1" netmask="255.255.255.0"> 
     <dhcp> 
      <range start="192.168.122.2" end="192.168.122.254" /> 
     </dhcp> 
     </ip> 
    </network> 
+0

接受的答案(來自sudo_o)不起作用。例如,用'fip 192.168.247 192.168.73.1 192.168.188.13 192.168.123'在文件t1中,命令'sed's/192.168。[0-9] * \。\([0-9] * \)/ 192.168.15。\ 1 /'t1'產生'fip 192.168.247 192.168.15.1 192.168.188.13 192.168.123',而我的答案產生'fip 192.168.15 192.168。15.1 192.168.15.13 192.168.15' –

+0

@ jwpat7你錯了。操作系統要求只更改IP地址的三部分,並提供他需要更改的文件示例。你誤解了,你不能以aaa.bbb.ccc格式擁有IP地址,所以你的觀點是沒有意義的。 –

+0

@sudo_o,問題說:「也可能是192.168.122.2或192.168.122」。重新3組表格請參閱我的回答結束 –

回答

0

sed命令

NEWIP=YYY 
sed "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename 

(帶代替YYY的一些數)會改變192.168.XXX到192.168.YYY,並且通過這樣做,這將改變形式192.168.XXX.ZZZ到192.168.YYY .ZZZ也是如此。在s/.../.../gg表示要改變一行中的所有匹配,而不是第一個。如圖所示,它將在stdout上輸出結果。如果你想編輯一個文件,請使用-i選項:如果你想使原來與擴展〜備份後編輯代替文件

sed -i "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename 

,你可以說:

sed -i~ "s/192\.168\.[0-9]*/192.168.$NEWIP/g" filename 

注意,改變表格192.168.122的條目(即有三個部分而不是四個的條目)是根據要求完成的;然而,這樣的改變並不一定有意義。如在LarsH's answerWhy does pinging 192.168.072 (only 2 dots) return a response from 192.168.0.58?中指出的那樣,IP虛線形式A.B.C等同於A.B.0.C,並且如果遵循該慣例,則將192.168.122(具有值192.168.0.122)更改爲192.168.15(具有值192.168.0.15 )。

+0

'NEWIP'變量的使用非常笨重,另外OP要求提供一個不符合的單線程。你應該學習如何使用捕獲組's/\(^ capture this line。$ \)/ \ 1 /',其中'\ 1'表示以'capture this line'開頭的匹配行。謝謝,我忘記了全局匹配的'/ g'。 –

+0

誰給我獎勵,從技術上來說前一個是正確的,但你的是更正..lol –

+0

兩者都可以考慮*同樣正確*但你應該接受第一個正確的答案..我的:) –

0

以下sed一個襯裏將改變一個IP 的(〜15在本例中)的第三部分並保留其他2層或3的部分保持不變。

sed -r 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g'

輸出:

192.168.0.12 
192.168.15.12 

192.168.25.34 
192.168.15.34 

192.168.0 
192.168.15 

因此,要改變所有的IP的從192.168.XXX.YYY192.168.15.YYY192.168.XXX192.168.YYYnetwork.conf運行

sed -r 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g' network.conf

這將顯示該文件stdout如果您對更改感到滿意,請使用-i選項將更改保存到文件。

sed -r -i 's/192\.168(\.??[0-9]*){2}/192.168.15\1/g' network.conf

只記得改變192.168.15.\1192.168.XXX.\1其中XXX是你需要(而不是15)和更改文件名也(從network.conf)的實際數量。

+1

鏈接你們是如此的好!謝謝! –

+0

FYI雙引號:\t \t sed -e「s/192.168。[0-9] * \。\([0-9] * \)/ 192.168。$ {NEW_RAND_SUBNET}。\ 1 /」$ {FIREWRULE} \t \t cat $ {FIREWRULE} | sed -e「s/192.168。[0-9] * \。\([0-9] * \)/ 192.168。$ {NEW_RAND_SUBNET}。\ 1 /」 –

+0

剛剛意識到它不會改變第二個「192.168。 122.254「...任何想法? –