我有一个如下 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"
}
]
}
}