Sed 在 XML 匹配后替换整行

Sed replace entire line after match in XML

一旦我确定了正确的标签,我想替换 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'

这可能是由于缺少转义字符而失败,我曾尝试将其放在不同的位置,但似乎没有正确处理。 将不胜感激。

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。使用双引号并转义 /

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>)|$nameVariable|g" file

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

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

脚本:

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

调用:

xsh script.xsh "$nameVariable"