我有以下XML:
<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”的bean内部。然后我需要修改它的值,使其为50而不是5000。
我尝试使用以下命令:
grep -A 4 "bean3" file.xml | sed 's/<!--//' | sed 's/-->//' | sed 's/5000/50/'
但我无法将其替换为文件。
我应该使用sed和/或grep吗?
答案 0 :(得分:2)
如果你正在使用GNU sed,你可以使用一个命令来完成所有操作:
sed '/bean3/,+5s/<!-- *\|-->//g; /bean3/,+5s/5000/50/' file.xml
您只需要运行sed
命令的一个实例。单个sed命令用分号;
分隔。在这种情况下,我们只需要两个sed命令:
<!--
(可选地后跟空格)和-->
- 使用替换\|
运算符和g
(全局)修饰符。 5000
替换为50
。 /bean3/,+5
范围是GNU扩展;这确保了上述替换仅在第一次出现bean3
之后的5行上执行。此范围用于两个替换命令。
如果您确信sed命令可以执行您想要的操作,则可以使用-i
/ --in-place
选项更改file.xml
。
答案 1 :(得分:0)
以下是一个AWK脚本,用bean
扫描id="bean3"
标记并取消注释并将"5000"
更改为"50"
,直到下一个bean
标记:< / p>
#!/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
执行打印行的默认操作。
答案 2 :(得分: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>