我想在识别正确的标签后替换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'
由于缺少逃避字符,这可能是失败的,我试过把它放在不同的地方,但似乎并没有让它们正确。 非常感谢帮助。
答案 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"