2016-01-22 67 views
0

我有下面的XML:用sed替换字符串 - 只有在模式匹配

<xml> 

    <bean id="bean1" 
     class="class1" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <!--    <property name="MyProperty" value="5000"/> --> 

    </bean> 

    <bean id="bean2" 
     class="class2" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <!--    <property name="MyProperty" value="5000"/> --> 

    </bean> 

    <bean id="bean3" 
     class="class3" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <!--    <property name="MyProperty" value="5000"/> --> 

    </bean> 
</xml> 

我需要取消对元素:

<!--    <property name="MyProperty" value="5000"/> --> 

只有内部ID为 “bean3” 豆。然后,我需要修改它的价值,所以它是50,而不是5000

我曾尝试使用下面的命令尝试:

grep -A 4 "bean3" file.xml | sed 's/<!--//' | sed 's/-->//' | sed 's/5000/50/' 

但我不能够取代它的文件。

我应该使用sed和/或grep吗?

+0

'grep'将只提取符合模式的行。其余的被删除。在这种情况下,您还想保留所有其他行。但限制你只想用'id =“bean3”'修改'bean'标签使事情复杂化。我会建议使用真正解析XML的东西,但它可能不会收集评论。 – e0k

+0

可能是http://stackoverflow.com/q/784745/7552的副本 –

回答

0

如果您使用GNU sed的,你可以用一个命令做这一切:

sed '/bean3/,+5s/<!-- *\|-->//g; /bean3/,+5s/5000/50/' file.xml 

你只需要运行sed命令的一个实例。单独的sed命令用分号分隔,;。在这种情况下,我们只需要两个sed命令:

  1. 第一替补都<!--(任选随后用空格)和-->与空字符串 - 使用交替\|运营商和g(全球)修改。
  2. 第二个简单替换500050

/bean3/,+5范围是一个GNU扩展;这确保了上述替换仅在第一次出现bean3之后的5行上执行。这个范围用于替代命令。

如果您确信sed命令能够满足您的要求,可以使用-i/--in-place选项更改file.xml

0

下面是一个AWK脚本,扫描为bean标签与id="bean3"和取消注释,并改变"5000""50"直到下一个bean标签:

#!/usr/bin/awk 

BEGIN{ in_bean3 = 0 } 
$0~/<bean/{ # match start of bean tag 
    if ($0 ~ "id=\"bean3\"") { 
     # Set flag for desired context 
     in_bean3 = 1 
     print 
     next 
    } else { # clear flag 
     in_bean3 = 0 
    } 
} 
in_bean3 { # in desired context 
    sub(/<!-- */, "") 
    sub(/ *-->/, "") 
    sub(/"5000"/, "\"50\"") 
} 
1 

通知的1末进行打印的默认操作线。

0
$ awk '/<bean id=/{f=(/bean3/?1:0)} f&&gsub(/<!-- *| *-->/,""){sub(/00/,"")} 1' file 
<xml> 

    <bean id="bean1" 
     class="class1" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <!--    <property name="MyProperty" value="5000"/> --> 

    </bean> 

    <bean id="bean2" 
     class="class2" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <!--    <property name="MyProperty" value="5000"/> --> 

    </bean> 

    <bean id="bean3" 
     class="class3" 
     singleton="false"> 
     <property name="dbPoolName" value="pool"/> 
     <property name="dirName" value="myDir"/> 
     <property name="MyProperty" value="50"/> 

    </bean> 
</xml>