2016-11-15 74 views
0

我需要在ec2-instance中運行用戶數據腳本,該腳本更改文件夾中的XML。從腳本編輯xml

我有這樣一個在路徑中EC2的XML:

<Root> 
    <Properties> 
     <Property> 
      <Name>myProp</Name> 
      <Value>old_value</Value> 
     </Property> 
     <Property> 
      <Name>anotherProp</Name> 
      <Value>other_value</Value> 
     </Property> 
    </Propierties> 
</Root> 

我想改變OLD_VALUENEW_VALUE。但只是那一個,不是other_value

我該怎麼做?

我已經嘗試了的PowerShell腳本,但我不知道如何運行它來測試它:

#!/bin/bash 
$path = '/home/wowza/conf/Server.xml' 

$new_value = 'new_value' 

$xml = [xml](Get-Content $path) 

$xml.Data.Course.Subject 

$property = $xml.Root.Server.Properties.Property | where {$_.Name -eq 'myProp'} 
$property.Value = $new_value 

$xml.Save($path) 

請你給我一個腳本,不要忘了包括如何運行它來測試它,#的解釋器!線和安裝什麼東西。 謝謝!

+0

這可能會有所幫助:[使用xmlstarlet,如何更改元素的值](http://stackoverflow.com/q/35636357/3776858) – Cyrus

回答

1

下面的代碼將允許您設置NEW_VALUE對於目標域,即使你不知道什麼是old_value:

#!/bin/bash 

sed -i -e '/<Name>myProp<\/Name>/,/<Value>/s/^\s*<Value>.*$/<Value>new_value<\/Value>/' /folder/xml-file 

這裏唯一需要注意的是,腳本將剝離空白區域的縮進行被改變,但這只是一個不影響代碼結果的視覺事物;您可以在之後使用另一個sed命令添加您需要的縮進空間,如果這對您很重要。

+0

你真棒。 –

+0

你知道我可以如何獨立於old_value文本嗎?我的意思是,即使old_value不同,也要改變它? –

+0

上面的代碼已經做到了 - 無論old_value是什麼(並且您不需要在任何地方引用old_value),它都會更改目標字段的值。只需將上面代碼中的new_value更改爲任何要更新值的值即可。 –

2

隨着GNU sed的:

sed -i '/<Name>myProp<\/Name>/,/<Value>old_value<\/Value>/s/old_value/new_value/' file.xml 

輸出到文件file.xml:

<Root> 
    <Properties> 
     <Property> 
      <Name>myProp</Name> 
      <Value>new_value</Value> 
     </Property> 
     <Property> 
      <Name>anotherProp</Name> 
      <Value>other_value</Value> 
     </Property> 
    </Propierties> 
</Root> 
+0

這個作品完美!!!!!謝謝。你知道我可以如何獨立於old_value文本嗎?我的意思是,即使old_value不同,也要改變它? –

+0

嘗試這種情況:'sed的-i '/ myProp <\/Name> /,/ /S/ [^ <]*/ NEW_VALUE /' file.xml'或'的sed -E「/ myProp <\/Name> /,/ /S /( )。*(<\/Value>)/ \ 1new_value \ 2 /'file.xml' – Cyrus

+0

IT WORKS!謝謝你soo –