我们说我有以下的json。
{
"userid":334,
"Parameters": [
{
"ParameterValue": "james", "ParameterKey": "name"
},
{
"ParameterValue": "22", "ParameterKey": "age"
},
{
"ParameterValue": "belfast", "ParameterKey": "city"
},
{
"ParameterValue": "software", "ParameterKey": "career"
}
]
}
我有一些代码可以获取JSON并提取所有键及其值。
echo $my_json | jq -r '.Parameters[] | .ParameterKey + "=" + .ParameterValue' >> $OUTPUT_FILE
如果我查看输出文件,我会发现类似的内容:
name=james
age=22
city=belfast
career=software
我怎样才能找到,说"职业"并在将其放入$ OUTPUT_FILE之前更改它的值?示例如下:
name=james
age=22
city=belfast
career=consultation
答案 0 :(得分:2)
您可以使用map()
功能:
jq -r '.Parameters | map(
if .ParameterKey == "career" then (.ParameterValue = "foo") else . end)
[] | .ParameterKey + "=" + .ParameterValue'
答案 1 :(得分:2)
jq 解决方案:
echo $my_json | jq -r --arg career "consultation" '.Parameters[]
| [.ParameterKey, if (.ParameterKey == "career") then $career else .ParameterValue end]
| join("=")' > outputfile
--arg career "consultation"
- 将值"consultation"
传递到 jq 脚本中,作为名为$career
的预定义变量
join("=")
- 使用=
作为分隔符加入/破坏密钥和值
outputfile
内容:
name=james
age=22
city=belfast
career=consultation
答案 2 :(得分:1)
这是一个使用from_entries概括的解决方案 将数据转换为中间对象,object multiplication with *以更新所需的键,并使用函数格式化输出,同时考虑空白值。
首先,我们假设将使用--argjson参数调用jq,如下所示,以指定要替换的键:
$ jq -Mr --argjson replace '{"career":"consultation"}' -f filter.jq data.json
其中data.json
包含示例数据,filter.jq
包含以下过滤器:
def from_entries(k;v): map({(k):v})|add;
def format_output: keys[] as $k | if .[$k]!="" then "\($k)=\(.[$k])" else "#\($k)=" end;
.Parameters
| from_entries(.ParameterKey;.ParameterValue)
| . * $replace
| format_output
示例输出:
age=22
career=consultation
city=belfast
name=james
如果我们将其作为
运行$ jq -Mr --argjson replace '{"career":""}' -f filter.jq data.json
输出
age=22
#career=
city=belfast
name=james