簡體   English   中英

使用 jq 和外部命令修改 json 中的鍵值

[英]Modify a key-value in a json using jq with external command

給定一個json文件,我如何使用jq和外部命令來修改一個值?

就我而言,我想將完整的時間戳轉換為YYYY-MM-DD格式(例如,使用命令: date --date="2019-01-02T10:00:00.000Z" "+%Y-%m-%d" )

原裝JSON

[{"timestamp": "2019-01-01T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}]

全新 JSON

[{"timestamp": "2019-01-01"}, {"timestamp": "2019-01-02"}, {"timestamp": "2019-01-02"}]

鑒於您的示例輸入,這應該這樣做:

map(.timestamp |= .[:10])

如果這看起來過於簡單,請查看jq 的日期操作內置函數 可能在這里不需要外部工具。

如何使用 jq 和外部命令來修改值

它可以做到,雖然它並不漂亮:

jq --argjson update "$(jq -r '.[] | .timestamp' input.json |
    while read r ; do
      date --date="$r" "+%Y-%m-%d" 
    done |
    jq -nR [inputs] )" '
      reduce range(0;$update|length) as $i (.;
        .[$i].timestamp = $update[$i])
    ' input.json

(在某些環境中,可能需要調用gdate而不是date 。)

對於時間。json =

[{"timestamp": "2019-01-01T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}, {"timestamp": "2019-01-02T10:00:00.000Z"}]

使用

jq  '[.[]  | .timestamp |= (sub("\\.[0-9]+Z$"; "Z")  | fromdate | strftime("%Y-%m-%d"))]' time.json

生產

[
  {
    "timestamp": "2019-01-01"
  },
  {
    "timestamp": "2019-01-02"
  },
  {
    "timestamp": "2019-01-02"
  }
]

編輯說明: sub 是因為 jq 默認支持毫秒。 因此,為了使用內置的日期時間函數,您必須刪除毫秒。 其他答案在功能上也是正確的。 但我喜歡我的:-)

使用正則表達式從值中刪除 substring T10:00:00.000Z

jq '.[].timestamp |= (sub("\\T.*";"") )' file

Output:

[
  {
    "timestamp": "2019-01-01"
  },
  {
    "timestamp": "2019-01-02"
  },
  {
    "timestamp": "2019-01-02"
  }
]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM