如何在shell脚本中使用文件内的jq更新key中的值?

pxyaymoc  于 2022-11-16  发布在  Shell
关注(0)|答案(2)|浏览(234)

我有这样文件(精确格式):

{ "test": "10" }
{ "games": "30" }
{ "REPOSITORY": "5"}

我想更新key的值。例如games为66。所以新文件将是:

{ "test": "10" }
{ "games": "66" }
{ "REPOSITORY":"5"}

我使用了jq和临时文件的组合。

tmp=$(mktemp);
jq '.games = "66"' pair.json > "$tmp" && mv "$tmp" change.json

却得到了这样的输出。

{
  "test": "10",
  "games": "66"
}
{
  "games": "66"
}
{
  "REPOSITORY": "5",
  "games": "66"
}

其中游戏是写所有3而我只是希望它被更新只在其位置。此外,我希望值被更新使用bash变量,但我可以尝试找出使用--arg后,我解决了这个问题。请协助这里。

xienkqul

xienkqul1#

您的输入是一个对象流。因此,您的筛选表达式.games = "66"Assert记录games存在于流中的每个对象中。
若要单独更新特定对象,请先选取它,然后指定所需的值或更新它。

jq -c 'select(has("games")).games = "66"'

要回答OP关于如何对变量执行相同操作的说明,请执行以下操作

jq -c --arg key "games" 'select(has($key))[$key] = "555"'
py49o6xq

py49o6xq2#

一个简单的解决方案是使用带有赋值的select。如果条件不匹配,select将返回特殊值empty,如果匹配,则返回输入值。

select(.games).games = "66"

jq -c以生成紧凑格式,即每行一个JSON对象/文档。
要处理任意名称,请稍微更改语法:

select(.["games"])["games"] = "66"

并与通过CLI传递的参数一起使用:

jq -r --arg key "$var" 'select(.[$key])[$key] = "66"'

相关问题