我有一个json,我想在其中修改一个特定的值但是终端总是显示带有修改值的json,但它实际上并没有改变特定文件中的值。示例json:
{
name: 'abcd',
age: 30,
address: 'abc'
}
我想更改文件本身的地址值,但到目前为止,我还是无法这样做。我尝试使用:
jq '.address = "abcde"' test.json
但它没有用。有什么建议吗?
答案 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
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)