通过多行sed在XML标签内搜索和替换

时间:2018-12-18 15:44:23

标签: sed

我想更改特定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">

2 个答案:

答案 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标签的第二行。