【问题标题】:Replace xml attribute values for specific range in Shell script替换 Shell 脚本中特定范围的 xml 属性值
【发布时间】:2021-10-31 00:09:04
【问题描述】:

我有以下test.xml 文件,我想将属性value 替换为特定范围。

我想根据用户输入将RC value 的数量替换为随机数。

例如:如果用户只想替换前三个RC value,那么它应该更新前三个RC value

test.xml内容如下:

<documents><document id ="test"><doc:meta title = 'test-title'><doc-transform><item name="RC" value="1445352777130287"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document><document id ="test-2"><doc:meta title = 'test-title-2'><doc-transform><item name="RC" value="3527771302"></item><item name="VERSION" value="05-07-0044"></item><item name="DATE" value="2021-08-25"></item></doc-transform></doc:meta></document></documents>

我已经在 shell 脚本中尝试了以下代码,但它仍然替换了所有 RC 属性 value

var=$1 #Command line arguments
var2=$RANDOM
for i in $1;
do
sed -E -i 's|(item name="RC" value=").*(">)|\1'$var2'\2|' test.xml
done

我已经在shell脚本中尝试了另一个代码,但它仍然替换了所有RC属性value

var=$1 #Command line arguments
var2=$RANDOM
for i in $1;
do
sed -E -i 's|(item name="RC" value=").*(">)|\1'$var2'\2|$var' test.xml
done

您能否为此提出解决方案?

如果可以迭代交互模式,你们能建议我吗?

【问题讨论】:

  • 使用真正的 XML 解析器来处理 XML。否则,XML 处理可能出错的方式太多了。对于这样的事情,我会进一步建议使用 XSLT 处理器(它必须包含 XML 解析器)。

标签: linux bash shell sed


【解决方案1】:

正如评论中提到的,理解 XML 的工具是必经之路。当涉及到 XML 时,正则表达式几乎总是使用错误的东西(如果您进行一些搜索,有很多关于为什么在 SO 上的问题和答案); XPath 更适合描述您想要匹配的内容。

使用xmlstarlet 将用户提供的数值更新为随机数的示例:

#!/usr/bin/env bash

random_rcs() {
    local count="$1" filename="$2" n
    local -a args
    for (( n = 0; n < count; n++ )); do
        args+=(--update "(//item[@name=\"RC\"])[$n]/@value" -v $RANDOM)
    done
    xmlstarlet ed --inplace "${args[@]}" "$filename"
}

random_rcs 3 test.xml

它为xmlstarlet ed 构建一个参数数组,每个参数都会更改与XPath 表达式匹配的节点的值属性,以找到名称属性为"RC" 的第n 个项目节点。

您的示例 XML 会产生一些关于命名空间的警告;如果您的实际输入也是如此,请修复文件或将标准错误重定向到/dev/null。 (如果使用命名空间,XPath 表达式可能也需要一些调整。)

【讨论】:

  • 谢谢Shwan,可以使用sed吗?我被限制使用 xmlstarlet
  • @KAS 这就像尝试使用锤子将 2x4 切割成尺寸一样。完全不适合这项工作的工具。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2012-11-15
  • 1970-01-01
相关资源
最近更新 更多