我正在尝试从json文件中删除一个特定的键/值对。
在此示例中,我的json文件为params.json
[
{
"ParameterKey": "RTSMMinSize",
"ParameterValue": "1"
},
{
"ParameterKey": "RTSMReplicateDB",
"ParameterValue": "false"
},
{
"ParameterKey": "RTSMSnapshotID",
"ParameterValue": "snapID"
},
{
"ParameterKey": "RTSMEMAIL",
"ParameterValue": ""
}
]
我想完全删除RTSMSnapshotID
键值对作为bash脚本的一部分。该文件应如下所示:
[
{
"ParameterKey": "RTSMMinSize",
"ParameterValue": "1"
},
{
"ParameterKey": "RTSMReplicateDB",
"ParameterValue": "false"
},
{
"ParameterKey": "RTSMEMAIL",
"ParameterValue": ""
}
]
我认为这就像
一样简单jq 'del(.RTSMSnapshotID)' params.json
但是我得到了
jq: error (at <filename>): Cannot index array with string "RTSMSnapshotID"
很明显,我不明白删除是如何工作的。有帮助吗?
答案 0 :(得分:5)
del(.foo)
期望有一个顶级字典,其关键字为foo
。这里不是这种情况。相反,您有一个顶级列表,其中ParameterKey
具有一系列值,并且只希望删除其中一个对。
jq '[ .[] | select(.ParameterKey != "RTSMSnapshotID") ]'
...或...
jq 'map(select(.ParameterKey != "RTSMSnapshotID"))'
答案 1 :(得分:0)
让我为您提供一个替代解决方案-一种用于JSON的步行路径Unix工具: jtc
。 公开:我是创作者。
您的示例似乎只是一个较大JSON的部分代码段,因为已对其进行枚举,但您的条目周围缺少[
,]
。如果是这样,和/或括号被恢复,则用jtc
删除所需的值就像:
bash $ <params.json jtc -w'<RTSMSnapshotID>[-1]' -p
[
{
"ParameterKey": "RTSMMinSize",
"ParameterValue": "1"
},
{
"ParameterKey": "RTSMReplicateDB",
"ParameterValue": "false"
},
{
"ParameterKey": "RTSMEMAIL",
"ParameterValue": ""
}
]
bash $
如果您想将更改直接应用到源文件(params.json
)中,然后抛出-f
选项,并将文件名传递给jtc
:。
bash $ jtc -w'<RTSMSnapshotID>[-1]' -p -f params.json
bash $ jtc params.json
[
{
"ParameterKey": "RTSMMinSize",
"ParameterValue": "1"
},
{
"ParameterKey": "RTSMReplicateDB",
"ParameterValue": "false"
},
{
"ParameterKey": "RTSMEMAIL",
"ParameterValue": ""
}
]
bash $