xml - 用于更新部分 XML 元素值的 Bash 脚本

标签 xml linux bash macos xmlstarlet

我需要一个 bash 脚本来根据其他一些动态属性更新部分 XML 元素值。

例如,XML 文件:

<?xml version="1.0"  encoding="ISO-8859-1"?>
 <Configure class="org.eclipse.something">
   <Set name="foo">foo-val</Set>
   <Set name="bar">bar-val</Set>
   <Set name="my-elm">/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED</Set>
 </Configure>

尝试将 xmlstarlet 与正则表达式结合使用,但未提供我想要的结果。 我正在使用 OSX 10.12。

最佳答案

使用 xmlstarlet 和下面的 xpath 表达式对我来说效果很好。下面的表达式对 XML 文件进行实时替换(-L 标志)

xmlstarlet edit -L -u "/Configure/Set[@name='my-elm']" -v '/dont/matter/THIS_ONE_NEED_TO_BE_UPDATED' xml-file

删除 -L 标志以检查替换是否正确发生,一旦成功添加相同的内容。

OS X 上检查 xmlstarlet (1.6.1)

虽然严格NOT 建议使用 sed 进行 xml 更新,下面的逻辑将适用于你,

sed "s/\(<Set name=\"my-elm\".*>\)[^<>]*\(<\/Set.*\)/\1\/dont\/matter\/THIS_ONE_NEED_TO_BE_UPDATED\2/" xml-file

添加 -i.bak 用于文件的就地替换。

关于xml - 用于更新部分 XML 元素值的 Bash 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41427790/

相关文章:

linux - 如何使用 -ggdb 标志编译 linux 内核模块

bash - 过滤文本文件以根据第 3 列中的值获取唯一条目

xml - 是否可以流解析XML父元素而不解析其子元素?

Android如何为回收站 View 制作自定义滚动条

linux - 加快我的控制台设置

linux - Linux 上的第一个 top 命令结果可信吗?

regex - Bash,grep在两行之间指定字符串

java - Xstream对象序列化

xml - XPath 检查 java 脚本中元素中是否存在值

linux - LXDE - 将窗口置于最前面