【发布时间】:2019-12-12 13:39:36
【问题描述】:
假设我有一个 xml 文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="a"></string>
</map>
我想用属性 a 来设置 string 的值,用一些大的东西:
$ xmlstarlet ed -u '/map/string[@name="a"]' -v $(for ((i=0;i<200000;i++)); do echo -n a; done) example.xml > o.xml
这将导致 bash 错误“参数列表太长”。我无法在 xmlstarlet 中找到接受文件结果的选项。那么,如何设置 200KB 数据+的 xml 标签的值呢?
解决方案
在尝试通过参数 -a (append) 将块输入 xmlstarlet 之后,我意识到我遇到了额外的困难,例如特殊字符的转义和 order哪个 xmlstarlet 接受这些块。 最终我恢复到更简单的工具,比如 xml2/sed/2xml。我将代码作为单独的帖子放在下面。
【问题讨论】:
-
如果您想要破解,请将其设置为您确定在 xml 中不存在的某个字符串(例如
THIS_STRING_DOES_NOT_EXIST),然后使用 sed 或类似方法将THIS_STRING_DOES_NOT_EXIST替换为您想要的字符串工具。` -
@anishsane 我只是想找到一种合法的方式来编辑 xml。
-
您可以使用 xmlstarlet (append) 的 -a 选项而不是 -v,将命令减少到 20000 而不是 200000,然后循环 10 次。因此,您将在每个循环中附加 20000 个。
-
@Roadowl 有趣的提议。不过,我不会称其为合法方式。 :)
-
@Roadowl 有什么建议可以在 bash 中做到这一点吗?我尝试使用 xargs、read、echo 和 cut .... 的组合,但没有成功。让我们假设我们正在处理真实世界的数据,而不仅仅是一串“a”
标签: bash xmlstarlet