Sed替换XML中匹配后的整行
我想在识别正确的标记后替换XML中的一行 接受 我想换一个 安得烈 具有 鲍勃 其中Bob存储在$nameVariable中 使用sedSed替换XML中匹配后的整行,xml,bash,sed,Xml,Bash,Sed,我想在识别正确的标记后替换XML中的一行 接受 我想换一个 安得烈 具有 鲍勃 其中Bob存储在$nameVariable中 使用sed sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g' 这可能是由于缺少转义字符而失败的,我尝试将其放置在不同的位置,但似乎没有正确地设置它们。 非常感谢您的帮助。sed不是编辑XML的好工具。无论采用哪种方式,如果换行符出现在错误
sed -i 's/<My_Name>.*</My_Name>/<My_Name>$nameVariable</My_Name>/g'
这可能是由于缺少转义字符而失败的,我尝试将其放置在不同的位置,但似乎没有正确地设置它们。
非常感谢您的帮助。sed不是编辑XML的好工具。无论采用哪种方式,如果换行符出现在错误的位置,或者有空标记,或者有嵌套标记,或者在无数其他情况下,它都会中断 使用正确解析XML的工具。例如,使用xmlstarlet:
xmlstarlet ed -u '/root/My_Name' -v "$nameVariable" filename.xml
此awk可用于:
awk -v name="$nameVariable" '/<My_Name>/{sub(/>.*</,">"name"<")}1' 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所以我不需要逃避。
将/替换为|,这样就不需要转义/了。不要使用正则表达式来处理XML。使用适当的XML处理工具。例如,我使用: 剧本:
open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
调用:
xsh script.xsh "$nameVariable"
谢谢你的回答!尽管如此,脚本仍将在多台机器上运行,sed是可以使用的工具,而其他工具不能强制使用。但是,原始XML的格式将严格执行,并承担风险。使用双引号展开变量并转义/,请参阅我的post.spot on,这正是我想要的!谢谢大家!@马蒂,不客气。更新了一些帖子。
open file.xml ;
set /root/My_Name { $ARGV[0] } ;
save :b ;
xsh script.xsh "$nameVariable"