在XML中匹配后,Sed替换整行

时间:2015-01-30 10:01:52

标签: xml bash sed

我想在识别正确的标签后替换XML中的一行。

<root>
    <My_Name>Andrew</My_Name>
    <My_Age>94</My_Age>
</root>

我想替换 安德鲁 同 鲍勃

其中Bob存储在$ nameVariable

使用sed,

sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g'

由于缺少逃避字符,这可能是失败的,我试过把它放在不同的地方,但似乎并没有让它们正确。 非常感谢帮助。

3 个答案:

答案 0 :(得分:0)

sed不是编辑XML的好工具。无论你采用哪种方式,如果在错误的地方出现换行,或者如果有空标签,或者有​​嵌套标签,还是在其他大量案件中,它就会破裂

使用可正确解析XML的工具。例如,使用xmlstarlet:

xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml

答案 1 :(得分:0)

awk可能有效:

awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' file
<root>
    <My_Name>Bob</My_Name>
    <My_Age>94</My_Age>
</root>

修复您的sed。使用双引号并转义/

sed -i "s/<My_Name>.*<\/My_Name>/<My_Name>$nameVariable<\/My_Name>/g" file
<root>
    <My_Name>Bob</My_Name>
    <My_Age>94</My_Age>
</root>

您可以更改一些,这样您就不需要两次文字了:

sed  -i -r "s|(<My_Name>).*(</My_Name>)|\1$nameVariable\2|g" file

-r所以我不需要逃避()/替换为|,因此无需转义/

答案 2 :(得分:0)

不要使用正则表达式来处理XML。使用适当的XML处理工具。例如,我使用xsh

剧本:

open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;

调用:

xsh script.xsh "$nameVariable"