gpt4 book ai didi

json - 使用jq修改JSON

转载 作者:行者123 更新时间:2023-11-29 09:17:28 24 4
gpt4 key购买 nike

我想使用 Linux 命令行修改 JSON 文件。

我尝试了这些步骤:

[root@localhost]# INPUT="dsa"
[root@localhost]# echo $INPUT
dsa
[root@localhost]# CONF_FILE=test.json
[root@localhost]# echo $CONF_FILE
test.json
[root@localhost]# cat $CONF_FILE
{
"global" : {
"name" : "asd",
"id" : 1
}
}
[root@localhost]# jq -r '.global.name |= '""$INPUT"" $CONF_FILE > tmp.$$.json && mv tmp.$$.json $CONF_FILE
jq: error: dsa/0 is not defined at <top-level>, line 1:
.global.name |= dsa
jq: 1 compile error

期望的输出:

[root@localhost]# cat $CONF_FILE
{ "global" : {
"name" : "dsa",
"id" : 1 } }

最佳答案

您唯一的问题是脚本传递给了 jq被错误引用。

在您的特定情况下,使用带有嵌入式 \ 的单个双引号字符串-转义 "实例可能是最简单的:

jq -r ".global.name = \"$INPUT\"" "$CONF_FILE" > tmp.$$.json && mv tmp.$$.json "$CONF_FILE"

但是,一般来说, chepner's helpful answer显示了一种更强大的替代方法,可以直接在脚本中嵌入 shell 变量引用:使用 --arg选项 将值作为 jq 传递变量 允许单引号 脚本,这是更可取的,因为它避免混淆哪些元素由 shell 预先展开并避免转义 $ 的需要应该传递给 jq 的实例.

还有:

  • 只是 =足以分配值(value);同时 |= ,即所谓的更新运算符,也可以工作,它的行为与 = 相同在这种情况下,因为 RHS 是一个文字,而不是引用 LHS 的表达式 - 参见 the manual .
  • 你应该经常用双引号引用你的 shell 变量,你应该避免使用全大写的变量名,以便 avoid conflicts with environment variables and special shell variables .

至于为什么您的引用不起作用:

'.global.name |= '""$INPUT""由以下标记组成:

  • 字符串文字 .global.name |= (由于单引号)
  • 字符串文字 "" - 即空字符串 - 引号将在 jq 之前被 shell 删除看到脚本
  • 对变量 $INPUT未加引号引用(这使得它的值(value)受到分词和通配的影响)。
  • 文字的另一个实例 "" .

用你的样本值,jq最终看到以下字符串作为其脚本:

.global.name |= dsa

如您所见,缺少双引号,导致 jq解读dsa作为函数名称 而不是字符串文字,并且因为没有参数传递给(不存在的)函数 dsa , jq的错误消息将其引用为 dsa/0 - 一个没有(0)参数的函数。

关于json - 使用jq修改JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41503387/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com