Bash和jq - 查找变量中包含的密钥并更改其值

时间:2017-10-19 10:18:00

标签: json bash jq

我们说我有以下的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

3 个答案:

答案 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

Try it online!