【问题标题】:Sed replace entire line after match in XML [duplicate]Sed在XML匹配后替换整行[重复]
【发布时间】:2024-01-15 17:53:01
【问题描述】:

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

这可能是由于缺少转义字符而失败的,我尝试将其放在不同的位置,但似乎没有正确。 非常感谢您的帮助。

【问题讨论】:

  • 使用双引号来扩展变量并转义/,见我的帖子。

标签: xml bash sed


【解决方案1】:

这个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 所以我不需要转义()
/ 替换为|,因此无需转义/

【讨论】:

  • 找到了,正是我想要的!谢谢!
  • @Marty 欢迎您。更新了一些帖子。
【解决方案2】:

sed 不是编辑 XML 的好工具。无论您采用哪种方式,如果换行符在错误的位置,或者如果有一个空标签,或者如果有嵌套标签,或者在无数其他情况下,它都会中断。

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

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

【讨论】:

  • 感谢您的回答!尽管如此,该脚本仍将在多台机器上运行,其中 sed 是可以使用的工具,而其他工具则不能强加。但是,原始 XML 的格式将被严格规定并承担风险。
【解决方案3】:

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

脚本:

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

调用:

xsh script.xsh "$nameVariable"

【讨论】: