Canna
Canna

Reputation: 151

How to use jq to extract object with condition (if) and put it back in an array

I have a problem with a jq command, i have tried to parse all my :

Add some filter:

And then do an update:

But with this command, i'm destroying my json

I have the following input (terraform state):

state.json

{
  "version": 4,
  "terraform_version": "0.13.4",
  "serial": 1,
  "lineage": "xxx",
  "resources": [
    {
      "module": "module.cname[\"tiger2\"]",
      "mode": "managed",
      "type": "service",
      "name": "service",
      "xxx" : "xxx"
    },
    {
      "module": "module.cname[\"tiger2\"]",
      "mode": "managed",
      "type": "user",
      "name": "other1",
      "xxx" : "xxx"
    },
    {
      "module": "module.cname[\"tiger1\"]",
      "mode": "managed",
      "type": "project",
      "name": "other2",
      "xxx" : "xxx"
    }
  ]
}

I want to change it to:

{
      "version": 4,
      "terraform_version": "0.13.4",
      "serial": 1,
      "lineage": "xxx",
      "resources": [
        {
          "module": "module.cname[\"tiger2\"]", # Filter one
          "mode": "managed",
          "type": "new_service",                # Only this one
          "name": "service",                    # filter two
          "xxx" : "xxx"
        },
        {
          "module": "module.cname[\"tiger2\"]",
          "mode": "managed",
          "type": "user",
          "name": "other1",
          "xxx" : "xxx"
        },
        {
          "module": "module.cname[\"tiger2\"]",
          "mode": "managed",
          "type": "project",
          "name": "other2",
          "xxx" : "xxx"
        }
      ]
    }

I have tried:

< tfplan.json jq --arg MODULE_SEARCH 'module.cname["tiger2"]' \
            --arg FILTER_SEARCH service \
            --arg TO_UPDATE new_service \
            '.resources[] | if .module == $MODULE_SEARCH and .name == $FILTER_SEARCH then (.type |=$TO_UPDATE) else . end'

Which give me:

{
  "module": "module.cname[\"tiger2\"]",
  "mode": "managed",
  "type": "new_service",
  "name": "service",
  "xxx": "xxx"
}
{
  "module": "module.cname[\"tiger2\"]",
  "mode": "managed",
  "type": "user",
  "name": "other1",
  "xxx" : "xxx"
}
{
  "module": "module.cname[\"tiger2\"]",
  "mode": "managed",
  "type": "project",
  "name": "other2",
  "xxx" : "xxx"
}

I have two issues with this:

Thanks

Upvotes: 1

Views: 971

Answers (1)

Philippe
Philippe

Reputation: 26592

You just need to add an equal sign :

< tfplan.json jq --arg MODULE_SEARCH 'module.cname["tiger2"]' \
                 --arg FILTER_SEARCH service \
                 --arg TO_UPDATE new_service \
'.resources[] |= if .module == $MODULE_SEARCH and
                    .name == $FILTER_SEARCH
                 then .type |= $TO_UPDATE
                 else . end'

Upvotes: 2

Related Questions