我想更改特定XML标记属性的值。
关于如何处理sed的问题很多,但是这里的问题是标记中的换行符。
我想更改name=
之后的值,并且必须在<package ... >
标签中进行搜索
不能选择XMLStarlet。
Coverage.xml
<package branch-rate="0.031746031746" complexity="0.0"
line-rate="0.159420289855" name="include">
<classes>
<class branch-rate="0.0" complexity="0.0"
到目前为止我最好的尝试:
sed -n '/<package/ {
:a
n
/<classes>/q
s/name=/xxxx/g
}' coverage.xml
你有个主意吗?
更新2:使用@ RavinderSingh13方法的coverage.xml更多
<package branch-rate="0.031746031746" complexity="0.0"
line-rate="0.159420289855" name="NEW_VALUE">
<classes>
<class branch-rate="0.0" complexity="0.0"
filename="NEW_VALUE"
name="NEW_VALUE">
答案 0 :(得分:0)
如果您对awk
表示满意,那么根据显示的示例,您可以尝试执行一次。(这只会查找package标签及其名称值,而其余的标签则无济于事)< / p>
awk '/^>/{flag=""} /<package/{flag=1} flag && /name=/{sub(/name=.*\"/,"name=\"NEW_VALUE\"")} 1' Input_file
如果您想将输出保存到Input_file本身,也将> temp_file && mv temp_file Input_file
附加到上述代码中。
答案 1 :(得分:0)
我只是使用for循环做了一些调整。
LINES=`awk '/<package /{print NR+1}' coverage.xml`
for i in ${LINES};
do
echo $i
sed -i ''"${i}"'s/name=.*/name="NEW_VALUE"/' coverage.xml;
done
NR+1
有助于到达package标签的第二行。