【问题标题】:set the property value for a single attribute in xml using bash script使用 bash 脚本在 xml 中设置单个属性的属性值
【发布时间】:2023-03-08 00:05:02
【问题描述】:

我正在使用这个 XML 文件:https://github.com/apache/ranger/blob/master/ugsync/src/test/resources/ranger-ugsync-site.xml

现在,我必须将以下属性的值更新为 false。

<property>
  <name>ranger.usersync.group.usermapsyncenabled</name>
  <value>true</value>
</property>

要将 XML 中的属性值更新为 false,我在 bash 脚本中使用以下命令来完成更新。

tag1=<name>ranger.usersync.group.usermapsyncenabled</name>
file=xml_file.xml
temporary=temp.xml

grep -A1 $tag1 $file | grep -v $tag1 | sed -e "s/^.*<value>/<value/" | sed -e "s/<value>true<\/value>/<value>false<\/value>/g" $file > $temporary

问题:脚本正在将文件中的所有其他属性更新为 true 到 false。我只需要更新这个属性的值而不是其他的。 输入/帮助表示赞赏。谢谢!

【问题讨论】:

  • 嗯。我很想将其称为 parsing xml and replacing specific tags shell script 的重复项,它的答案中也包含 XMLLint 方法。理想情况下,希望找到一个带有 Python-wrapped-in-a-shell-function 答案的重复问题,因为这对于无论出于何种原因无法安装 XMLStarlet 并且没有足够新的人来说可能很有用XMLLint.
  • ...顺便说一下,对于这类问题强烈首选支持 XML 的答案,因为标准的基于文本的工具只需'不,也不能,理解 XML。你不能教 grepsed 忽略 XML cmets 和 CDATA 部分,阅读 xmlns 标签来找出当前的命名空间,阅读 DTD 并理解它们的任何宏包含等。

标签: xml linux bash shell sed


【解决方案1】:

使用XMLStarlet

xmlstarlet ed \
  -u "//property[name='ranger.usersync.group.usermapsyncenabled']/value" \
  -v false \
  <in.xml >out.xml

用于确定要更改什么的 XPath 表达式确保我们只使用适当的 name 修改 property 下的 value

【讨论】:

  • 使用 XMLStarlet 的问题是它破坏了格式并且还将 行更改为 。希望一切都会好起来?我打算在 Dockerfile 中使用这个脚本,这样它就可以在我运行 dockerfile 时进行更新,所以我正在寻找更多的 sed 或 grep 步骤。抱歉,对脚本编写有点陌生,因此正在寻找正确的答案。
  • @yguw,这些值在语义上是等价的,也就是说,任何兼容的 XML 解析器都会将两个文档视为相同的,除了所需的更改。
  • 请看我的 cmets 关于为什么 sedgrep 不是任何类型 XML 操作任务的正确答案的问题。
  • 另外,请注意 xmlstarlet ed-S-P 参数以保留原始空白。
  • (顺便说一句,如果您想防止在修改 XML 文档的内容时对其文本进行虚假更改,请考虑将它们保持为规范化形式;请参阅XML C14N standard——任何支持标准将能够将规范化文档作为输入并发出逐字节相同的输出,但实际所需的更改除外(当被告知编写规范化输出时)。
猜你喜欢
  • 2021-04-01
  • 2021-08-23
  • 2023-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多