【问题标题】:jq replace part of value in jsonjq替换json中的部分值
【发布时间】:2018-08-17 07:48:08
【问题描述】:

我需要从 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 '.[] |选择 (.LastModified == "-") .LastModified = "/"' 和 |= 运算符,但我无法在网络上找到已完成此操作的其他任何地方。

【问题讨论】:

    标签: json sed edit jq iso8601


    【解决方案1】:

    使用 jqsub()fromdate() 函数:

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

    输出:

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

    【讨论】:

    • 正是我所寻找的并且完美地工作。你能解释发生的一切吗? “Z”是做什么的?
    • 刚刚意识到,在这里猜测,Z 将时间设置为 UTC?
    • @RyanLoeffler, Z 在日期时间字符串中是通用时间 (UTC) 指示符 en.wikipedia.org/w/index.php?title=ISO_8601
    【解决方案2】:

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

    .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"
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多