我在JSON文件中有一些数据库,我已经使用./jq排序并从对象中删除了一些数据 但是我一直坚持在对象中添加新变量。 这是我的JSON文件的一部分:
{
"Name": "Forrest.Gump.1994.MULTi.1080p.AMZN.WEB-DL.DDP5.1.H264-Ao",
"ID": "SMwIkBoC2blXeWnBa9Hjge9YPs90"
},
{
"Name": "Point.Blank.2019.MULTi.1080p.NF.WEB-DL.DDP5.1.x264-Ao",
"ID": "OZI4mOuBXuJ7b89FLgXJoozyhHe9"
},
{
"Name": "The.Incredible.Hulk.2008.MULTi.2160p.UHD.BluRay.REMUX.HDR.HEVC.DTS-HD.MA.7.1",
"ID": "jZzR4_B_vjm593cYKR7j97XAMv6d"
},
是否可以通过使用jq和例如RegExp提取一些数据并将其作为对象中的新变量插入,我希望达到这样的效果:
{
"Name": "Forrest.Gump.1994.MULTi.1080p.AMZN.WEB-DL.DDP5.1.H264-Ao",
"ID": "SMwIkBoC2blXeWnBa9Hjge9YPs90",
"Year": "1994",
"Res": "1080p"
},
{
"Name": "Point.Blank.2019.MULTi.1080p.NF.WEB-DL.DDP5.1.x264-Ao",
"ID": "OZI4mOuBXuJ7b89FLgXJoozyhHe9",
"Year": "2019",
"Res": "1080p"
},
{
"Name": "The.Incredible.Hulk.2008.MULTi.2160p.UHD.BluRay.REMUX.HDR.HEVC.DTS-HD.MA.7.1",
"ID": "jZzR4_B_vjm593cYKR7j97XAMv6d",
"Year": "2008",
"Res": "2160p"
},
预先感谢
答案 0 :(得分:0)
这里有一个解决方案,为简单起见,假设您显示的片段来自数组:
map( . as $in
| .Name | capture(".*[.](?<year>[12][0-9]{3})[.](?<rest>.*)")
| .year as $year
| (.rest | split(".") | .[1]) as $res
| $in + {Year: $year, Res: $res} )
希望,一旦您熟悉了一些jq基础知识,例如map
,capture
和EXP as $var
语法,上面的内容或多或少是不言自明的
这是一回事,但单线:
map(. + (.Name | capture(".*[.](?<Year>[12][0-9]{3})[.](?<Res>.*)") | {Year, Res: (.Res | split(".")[1])}))
答案 1 :(得分:0)
这是另一种方法,可以执行您的请求的JSON操作-使用基于步行路径的Unix实用程序 jtc
。
假设您的json位于文件database.json中
bash $ <database.json jtc -w'[Name]:<\.([12]\d{3})\.[^.]+\.([^.]+)>R:[-1]' -mi0 -T'{"Year":{$1}}' -i0 -T'{"Res":"{$2}"}'
[
{
"ID": "SMwIkBoC2blXeWnBa9Hjge9YPs90",
"Name": "Forrest.Gump.1994.MULTi.1080p.AMZN.WEB-DL.DDP5.1.H264-Ao",
"Res": "1080p",
"Year": 1994
},
...
insert-options(-i
)在这里使用了伪JSON(0
),因为两者都会进行模板插值,从而用插入的JSON值(对于Year
和Res
条记录。)
将根据匹配的$0
记录从相应记录的REGEX组($1
和Name
)中进行插值
PS>披露:我是jtc
-用于JSON操作的shell cli工具的创建者