Bash jq 修改 json : 获取和设置
Bash jq modify json : get and set
我使用 jq 来解析和修改 cURL 响应,它完美地满足了我的所有需求,只有一个除外。我想修改json中的一个键值,比如:
A) 输入json
[
{
"id": 169,
"path": "dir1/dir2"
}
]
B) 输出json
[
{
"id": 169,
"path": "dir1"
}
]
因此最后一个目录已从路径中删除。我使用脚本:
curl --header -X GET -k "${URL}" | jq '[.[] | {id: .id, path: .path_with_namespace}]' | jq '(.[] | .path) = "${.path%/*}"'
最后一个管道当然不正确,这就是我被卡住的地方。重点是获取path
值并修改。感谢任何帮助。
一种方法是使用 split
和 join
处理路径,并使用 |=
将正确的表达式绑定到 .path
属性。
... | jq '.[] | .path|=(split("/")[:-1]|join("/"))
split("/")
接受一个字符串,return 一个数组
x[:-1]
returns 由 x
的最后一个元素以外的所有元素组成的数组
join("/")
将传入数组的元素与 /
合并为 return 单个字符串。
.path|=x
获取 .path
的值,将其送入过滤器 x
,然后再次将结果值赋给 .path
。
我使用 jq 来解析和修改 cURL 响应,它完美地满足了我的所有需求,只有一个除外。我想修改json中的一个键值,比如:
A) 输入json
[
{
"id": 169,
"path": "dir1/dir2"
}
]
B) 输出json
[
{
"id": 169,
"path": "dir1"
}
]
因此最后一个目录已从路径中删除。我使用脚本:
curl --header -X GET -k "${URL}" | jq '[.[] | {id: .id, path: .path_with_namespace}]' | jq '(.[] | .path) = "${.path%/*}"'
最后一个管道当然不正确,这就是我被卡住的地方。重点是获取path
值并修改。感谢任何帮助。
一种方法是使用 split
和 join
处理路径,并使用 |=
将正确的表达式绑定到 .path
属性。
... | jq '.[] | .path|=(split("/")[:-1]|join("/"))
split("/")
接受一个字符串,return 一个数组x[:-1]
returns 由x
的最后一个元素以外的所有元素组成的数组
join("/")
将传入数组的元素与/
合并为 return 单个字符串。.path|=x
获取.path
的值,将其送入过滤器x
,然后再次将结果值赋给.path
。