gpt4 book ai didi

json - jq:如何根据子字符串匹配更新值?

转载 作者:行者123 更新时间:2023-12-03 20:18:41 26 4
gpt4 key购买 nike

我有一个 jq 题。给定一个文件 file.json 包含:

[
{
"type": "A",
"name": "name 1",
"url": "http://domain.com/path/to/filenameA.zip"
},
{
"type": "B",
"name": "name 2",
"url": "http://domain.com/otherpath/to/filenameB.zip"
},
{
"type": "C",
"name": "name 3",
"url": "http://otherdomain.com/otherpath/to/filenameB.zip"
}
]

我正在寻找使用 创建另一个文件jq 仅当 url 的值与某个模式匹配时才修改 url。例如,我想更新任何与模式匹配的网址:
http://otherdomain.com.*filenameB.*

到一些固定的字符串,例如:
http://yetanotherdomain.com/new/path/to/filenameC.tar.gz

生成的json:
[
{
"type": "A",
"name": "name 1",
"url": "http://domain.com/path/to/filenameA.zip"
},
{
"type": "B",
"name": "name 2",
"url": "http://domain.com/otherpath/to/filenameB.zip"
},
{
"type": "C",
"name": "name 3",
"url": "http://yetanotherdomain.com/new/path/to/filenameB.tar.gz"
}
]

我什至无法找到网址,更不用说更新它了。这是我得到的(错误的结果,并不能帮助我解决更新问题):
% cat file.json | jq -r '.[] | select(.url | index("filenameB")).url'
http://domain.com/otherpath/to/filenameB.zip
http://otherdomain.com/otherpath/to/filenameB.zip
%

关于如何获取具有与正则表达式匹配的值的键的路径的任何想法?之后,如何用一些新的字符串值更新键?如果有多个匹配项,则所有匹配项都应使用相同的新值进行更新。

最佳答案

好消息是,这个问题有一个简单的解决方案:

map( if .url | test("http://otherdomain.com.*filenameB.*")
then .url |= sub( "http://otherdomain.com.*filenameB.*";
"http://yetanotherdomain.com/new/path/to/filenameC.tar.gz")
else .
end)

不太好的消息是,除非您了解这里的关键技巧——“|=”过滤器,否则它并不容易解释。有很多关于它的 jq 文档,所以我只是指出它类似于 C 系列编程语言中的 += 运算符系列。

具体来说, .url |= sub(A;B)就像 .url = (.url|sub(A;B)) .这就是“就地”完成更新的方式。

关于json - jq:如何根据子字符串匹配更新值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35086206/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com