使用 jq 的更好方法

使用 jq 的更好方法

我有一个如下 JSON:

{
  "LDAP": {
    "RemoteRoleMapping": [
      {
        "LocalRole": "dirgroup234fe3432",
        "RemoteGroup": "CN=somethingelse,OU=another,OU=more,DC=my,DC=org"
      },
      {
        "LocalRole": "dirgroup47829ab78ed33",
        "RemoteGroup": "CN=mememe,OU=another,OU=more,DC=my,DC=org"
      },
      {
        "LocalRole": "dirgroup94728afe32a",
        "RemoteGroup": "CN=sysadmin,OU=another,OU=more,DC=my,DC=org"
      }
    ]
  }
}

我需要修改其中一个远程组名称的 DN。我所做的是:

TMPF=$(mktemp)
NEWDN="CN=something,OU=another,OU=more,DC=my,DC=org"
DATA="<above JSON>"
echo ${DATA} | jq -r '.[] | select(.RemoteGroup="'${OLDDN}'") | .RemoteGroup = "'${NEWDN}'"' | jq --slurp '.' > ${TMPF}
DATA=$(echo '{"LDAP":{"RemoteRoleing": '$(cat ${TMPF})'}}' | jq -r '.')

它获取了具有正确组名的 DATA 变量。我的问题是关于包含 slurp 的行。jq 有没有更好的方法来做到这一点?

答案1

您可以使用该--arg选项将数据传递到 jq 变量中,并顺便更新字段:

echo "$DATA" \
| jq  --arg newdn "this is the new DN" \
      --arg olddn "CN=sysadmin,OU=another,OU=more,DC=my,DC=org" \
      '.LDAP.RemoteRoleMapping |= map(
          if .RemoteGroup == $olddn
          then .RemoteGroup = $newdn
          else .
          end)'

输出此信息,其中最后一个 RemoteGroup 已更改

{
  "LDAP": {
    "RemoteRoleMapping": [
      {
        "LocalRole": "dirgroup234fe3432",
        "RemoteGroup": "CN=somethingelse,OU=another,OU=more,DC=my,DC=org"
      },
      {
        "LocalRole": "dirgroup47829ab78ed33",
        "RemoteGroup": "CN=mememe,OU=another,OU=more,DC=my,DC=org"
      },
      {
        "LocalRole": "dirgroup94728afe32a",
        "RemoteGroup": "this is the new DN"
      }
    ]
  }
}

相关内容