json - 尝试使用 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....
谢谢!
解决方案
这里推荐的方法是尽可能将路径作为数组传递,以便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
推荐阅读
- java - org.springframework.beans.factory.UnsatisfiedDependencyException org.springframework.beans.factory.NoUniqueBeanDefinitionException
- python - 是否有复制 pip 库的命令/程序
- c# - 无法将 JSON 反序列化为字典
- javascript - 计算要填充的可用插槽数量
- java - Libgdx 堆积图像
- ruby - "brew install ruby@2.3" + "gem install bundler" => 为什么找不到 bundle 命令?
- laravel - 流明:模型时间戳的 InvalidArgumentException 与 $dateFormat = 'U'
- javascript - 为什么这条评论会在 Javascript/React 代码中作为参数传递?
- xcode - 核心数据滑动删除实现中的错误
- php - Laravel - 子域路由前缀导致其他路由不返回“未找到”