使用jq修改json中的键值

时间:2017-03-10 10:59:43

标签: json bash shell jq

我有一个json,我想在其中修改一个特定的值但是终端总是显示带有修改值的json,但它实际上并没有改变特定文件中的值。示例json:

{
   name: 'abcd',
   age: 30,
   address: 'abc'
}

我想更改文件本身的地址值,但到目前为止,我还是无法这样做。我尝试使用:

jq '.address = "abcde"' test.json

但它没有用。有什么建议吗?

6 个答案:

答案 0 :(得分:38)

使用临时文件;这是任何声称进行就地编辑的程序正在做的事情。

tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json

答案 1 :(得分:29)

AFAIK jq不支持就地编辑,因此您必须首先重定向到临时文件,然后用它替换原始文件,或者使用moreutils包中的sponge实用程序,就像那样:

jq '.address = "abcde"' test.json|sponge test.json

还有其他技术可以“重定向到同一个文件”,比如将输出保存在变量e.t.c中。如果您想了解更多相关信息,“Unix& Linux StackExchange”是一个很好的起点。

答案 2 :(得分:13)

临时文件在不需要时会增加更多的复杂性(除非您真正处理的JSON文件太大,以至于无法将它们容纳在内存中(GB到GB或TB的100到100,这取决于您拥有多少RAM /并行性)

纯bash方式。

contents="$(jq '.address = "abcde"' test.json)" && \
echo "${contents}" > test.json

优点

  • 没有临时文件可以处理
  • 纯bash
  • 不需要管理员来安装sponge(默认情况下未安装)
  • 更简单

注意:这不能合并为“一个命令”,因为在命令开始执行之前,在命令前执行重定向,并清空文件,因此有两个单独的命令。

答案 3 :(得分:5)

只需将其添加到chepner答案中即可,如果您希望在shell脚本中添加它。

test.json

{
  "name": "abcd",
  "age": 30,
  "address": "abc"
}

script.sh

#!/bin/bash
address="abcde"
age=40

# Strings:
jq --arg a "${address}" '.address = $a' test.json > "tmp" && mv "tmp" test.json

# Integers:
jq --argjson a "${age}" '.age = $a' test.json > "tmp" && mv "tmp" test.json

答案 4 :(得分:0)

具有更改单个和多个值的嵌套 json 示例。

config.json

{
  "Parameters": {
    "Environment": "Prod",
    "InstanceType": "t2.micro",
    "AMIID": "ami-02d8e11",
    "ConfigRegion": "eu-west-1"
  }
}

使用以下命令,您可以编辑多个值。

tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf" | .Parameters.Environment = "QA"' config.json > "$tmp" && mv "$tmp" config.json

使用以下命令,您可以编辑单个值。

tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf"' config.json > "$tmp" && mv "$tmp" config.json

答案 5 :(得分:0)

我不喜欢任何解决方案并创建了 sde utility

pip install sde

然后你可以简单地做:

sde address abcde test.json