wol*_*ane 35 bash shell json jq
我有一个json,我想在其中修改一个特定的值,但终端始终显示带有修改值的json,但它实际上并没有更改特定文件中的值.示例json:
{
name: 'abcd',
age: 30,
address: 'abc'
}
Run Code Online (Sandbox Code Playgroud)
我想更改文件本身的地址值,但到目前为止我一直无法这样做.我试过用:
jq '.address = "abcde"' test.json
Run Code Online (Sandbox Code Playgroud)
但它不起作用.有什么建议?
che*_*ner 58
使用临时文件; 这是任何声称进行就地编辑的程序正在做的事情.
tmp=$(mktemp)
jq '.address = "abcde"' test.json > "$tmp" && mv "$tmp" test.json
Run Code Online (Sandbox Code Playgroud)
zep*_*lin 42
AFAIK jq不支持就地编辑,因此您必须先重定向到临时文件,然后用它替换原始文件,或者使用spongemoreutils包中的实用程序,如下所示:
jq '.address = "abcde"' test.json|sponge test.json
Run Code Online (Sandbox Code Playgroud)
还有其他技术可以"重定向到同一个文件",比如将输出保存在变量等中"Unix&Linux StackExchange"是一个很好的起点,如果你想了解更多.
And*_*ndy 29
临时文件在不需要时会增加更多的复杂性(除非您真正处理 JSON 文件太大以至于无法将它们放入内存中(GB 到 100 的 GB 或 TB,取决于您拥有多少 RAM/并行度)
纯粹的 bash 方式。
contents="$(jq '.address = "abcde"' test.json)" && \
echo "${contents}" > test.json
Run Code Online (Sandbox Code Playgroud)
sponge,默认不安装注意:这不能组合为“一个命令”,因为重定向在表达式的左侧 (LHS) 运行之前开始,并且在运行之前启动重定向会jq错误地清空文件,因此是两个单独的命令。
具有更改单个值和多个值的嵌套 json 的示例。
配置.json
{
"Parameters": {
"Environment": "Prod",
"InstanceType": "t2.micro",
"AMIID": "ami-02d8e11",
"ConfigRegion": "eu-west-1"
}
}
Run Code Online (Sandbox Code Playgroud)
使用以下命令,您可以编辑多个值。
tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf" | .Parameters.Environment = "QA"' config.json > "$tmp" && mv "$tmp" config.json
Run Code Online (Sandbox Code Playgroud)
使用以下命令,您可以编辑单个值。
tmp=$(mktemp)
jq '.Parameters.AMIID = "ami-02d8sdfsdf"' config.json > "$tmp" && mv "$tmp" config.json
Run Code Online (Sandbox Code Playgroud)
小智 7
只是为了添加到 chepner 答案,如果你想在 shell 脚本中使用它。
测试文件
{
"name": "abcd",
"age": 30,
"address": "abc"
}
Run Code Online (Sandbox Code Playgroud)
脚本文件
#!/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
Run Code Online (Sandbox Code Playgroud)
小智 7
这应该有效
address = aaaaa
echo $(jq --arg a "$address" '.address = ($a)' test.json) > test.json
Run Code Online (Sandbox Code Playgroud)
不管出于什么原因,如果没有 echo,它会生成一个 bin 文件,而我的 python 脚本无法解析它。
| 归档时间: |
|
| 查看次数: |
30318 次 |
| 最近记录: |