jq 替换 json 中的部分值

Rya*_*ler 7 json sed edit iso8601 jq

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

我需要将 LastModified 值上的破折号“-”替换为斜杠,然后删除一些东西,例如“T”和“.000Z”,这样我最终可以将该时间戳转换为纪元。

我尝试使用 cat list | jq -r '.[] | select (.LastModified == "-") .LastModified = "/"' 和 |= 运算符,但我无法在网络上的任何其他地方找到已完成的操作。

Rom*_*est 10

随着JQsub()fromdate()功能:

jq '.LastModified |= (sub("\\.000Z";"Z") | fromdate)' input.json
Run Code Online (Sandbox Code Playgroud)

输出:

{
  "LastModified": 1520443473,
  "Key": "pending/archive/f7ab1684-e94d-483e-ace1-560367c1196c_1000_s.json"
}
Run Code Online (Sandbox Code Playgroud)


Jef*_*ado 6

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

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

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

.LastModified |= "\(.[:10] | sub("-"; "/"; "g")) \(.[11:19])"
Run Code Online (Sandbox Code Playgroud)

两者的结果如下:

{
  "LastModified": "2018/03/07 17:24:33",
  "Key": "pending/archive/f7ab1684-e94d-483e-ace1-560367c1196c_1000_s.json"
}
Run Code Online (Sandbox Code Playgroud)