如何用jq替换JSON中LastModified字段内容并转换为epoch时间戳?
解决JSON中LastModified字段的字符串替换问题
我完全懂你的困扰——用sed -i改JSON简直是踩雷,一不小心就会改到其他无关字段,而之前尝试的jq命令没找对路子,所以没生效。咱们直接用jq的字符串处理能力,精准搞定这个需求就行。
正确的jq命令
你可以用这条命令来处理你的JSON文件:
cat list | jq '.[] |= (.LastModified |= (gsub("-"; "/") | sub("T.*"; "")))'
如果需要直接修改原文件(类似sed -i的效果),可以加上-i参数:
jq -i '.[] |= (.LastModified |= (gsub("-"; "/") | sub("T.*"; "")))' list
命令拆解
咱们一步步看每个部分的作用:
.[]:遍历JSON数组中的每一个元素|=:jq的更新操作符,意思是把后面的处理结果重新赋值给前面的元素/字段.LastModified |= gsub("-"; "/"):把LastModified字段里所有的短横线-替换成斜杠/(gsub是全局替换,会换掉所有匹配的字符)sub("T.*"; ""):用正则匹配从T开始到字符串结尾的所有内容,替换成空字符串——这样就一次性去掉了T和后面的.000Z
示例效果
假设你的输入JSON是这样的:
[ {"Filename": "report.pdf", "LastModified": "2024-05-20T14:30:00.000Z"}, {"Filename": "data.csv", "LastModified": "2024-06-10T09:15:45.000Z"} ]
处理后会变成:
[ {"Filename": "report.pdf", "LastModified": "2024/05/20"}, {"Filename": "data.csv", "LastModified": "2024/06/10"} ]
为什么之前的命令没生效?
你之前用的select (.LastModified == "-")是只筛选出LastModified字段值等于-的元素,这和你要对所有元素的LastModified做替换的需求不符,所以才没效果。去掉不必要的select,直接用更新操作符就能覆盖所有元素啦。
内容的提问来源于stack exchange,提问作者Ryan Loeffler
相关产品推荐
相关产品推荐

