首页 > 解决方案 > 尝试使用 jq 更新具有可变路径的值

问题描述

我正在尝试将 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....

谢谢!

标签: jsonpathjq

解决方案


这里推荐的方法是尽可能将路径作为数组传递,以便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

推荐阅读