2016-11-15 71 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 –