jq替换json中的部分值

时间:2018-03-08 20:28:28

标签: json sed edit jq iso8601

我需要从json输出中替换部分值,我可以使用sed -i轻松地执行此操作但是它也会替换文件的其他部分我不想要它,除非我遗漏了一些东西。输出是 { "LastModified": "2018-03-07T17:24:33.000Z", "Key": "pending/archive/f7ab1684-e94d-483e-ace1-560367c1196c_1000_s.json" }

我需要将LastModified值上的短划线“ - ”替换为斜线,然后删除一些东西,就像“T”和“.000Z”那样我最终可以将时间戳转换为纪元。

我尝试过使用 猫清单| jq -r'。[] | select(.LastModified ==“ - ”)。LastModified =“/”' 和| =运算符,但我无法在网络上的任何其他地方找到这个已完成。

2 个答案:

答案 0 :(得分:0)

使用 jq sub()fromdate()功能:

jq '.LastModified |= (sub("\\.000Z";"Z") | fromdate)' input.json

输出:

{
  "LastModified": 1520443473,
  "Key": "pending/archive/f7ab1684-e94d-483e-ace1-560367c1196c_1000_s.json"
}

答案 1 :(得分:0)

如果您的平台支持它,您可以使用日期函数进行解析,然后重新格式化日期字符串。

.LastModified |= (sub("\\.000Z$"; "Z") | fromdateiso8601 | strftime("%Y/%m/%d %H:%M:%S"))

否则,您可以使用通常的字符串操作技术。

.LastModified |= "\(.[:10] | sub("-"; "/"; "g")) \(.[11:19])"

两者都会产生结果:

{
  "LastModified": "2018/03/07 17:24:33",
  "Key": "pending/archive/f7ab1684-e94d-483e-ace1-560367c1196c_1000_s.json"
}