尝试使用 jq 更新具有可变路径的值

Trying to use jq to update a value with a variable path

我正在尝试将 JSON 路径作为变量传递到 jq 以更新值。这很好用:

jq '.Resources.lc.Properties.UserData."Fn::Base64" = "HHH"' my_data.json

我无法使用这样的任何组合:

 KEY='.Resources.lc.Properties.UserData."Fn::Base64"'
  jq --arg p "$KEY" '$p = "HHH"' my_data.json

n

jq:错误(在 my_data.json:470):结果为“.Resources.lc.Properties...

的路径表达式无效

谢谢!

你能试试这个吗?

KEY='.Resources.lc.Properties.UserData."Fn::Base64"'
jq "$KEY"' = "HHH"' my_data.json

这里推荐的做法是尽可能将路径作为数组传入,这样就可以使用setpath

KEY='["Resources", "lc", "Properties", "UserData", "Fn::Base64"]'
jq --argjson p "$KEY" 'setpath( $p; "HHH")' my_data.json

如果那不可能,下一个最好的办法可能是解析你的 $KEY 字符串 删除内部双引号:

KEY='.Resources.lc.Properties.UserData.Fn::Base64'
jq -n --arg p "$KEY" 'setpath( $p|split(".")[1:]; "HHH")' my_data.json

仅次于最佳的方法是去除内部双引号, 例如在 shell 或使用 jq

KEY='.Resources.lc.Properties.UserData.Fn::Base64'
jq -n --arg p "$KEY" '
  setpath( $p|gsub("\"";"")|split(".")[1:]; "HHH")
' my_data.json