如何用该值的子字符串替换值?

时间:2018-01-09 19:49:45

标签: json string edit jq in-place

我有一些看起来像这样的json(非常简化):

{"files":[
  {"date":"2018-01-08T11:38:36+00:00"},
  {"date":"2018-01-08T11:38:27+00:00"},
  {"date":"2018-01-07T20:02:12+00:00"},
  {"date":"2018-01-07T18:23:26+00:00"}
]}

我想将日期转换为纪元秒,以便我可以对它们进行排序。但这种格式与strptime不接受的格式不相符:

$ jq '.files[] | .date |= strptime("%Y-%m-%dT%H:%M:%S%z")' files.json 
jq: error (at files.json:6): date "2018-01-08T11:38:36+00:00" does not match format "%Y-%m-%dT%H:%M:%S%z"

所以,如果我只删除最后5个字符,我可以使用相同的格式,减去%z。这有效:

$ jq '.files[] | .date[0:19]' files.json 
"2018-01-08T11:38:36"
"2018-01-08T11:38:27"
"2018-01-07T20:02:12"
"2018-01-07T18:23:26"

那么,我在这里做错了什么:

$ jq '.files[] | map( .date |= .date[0:19] )' files.json 
jq: error (at files.json:6): Cannot index string with string "date"

感谢@peak,我得到了解决方案:

$ jq -c '.files[] | .date |= .[0:19]' files.json
{"date":"2018-01-08T11:38:36"}
{"date":"2018-01-08T11:38:27"}
{"date":"2018-01-07T20:02:12"}
{"date":"2018-01-07T18:23:26"}

1 个答案:

答案 0 :(得分:2)

  

jq'.files [] | map(.date | = .date [0:19])'files.json

上述问题至少存在两个问题。

您可以写.date = .date[0:19]或(更好):.date |= .[0:19]

目前还不完全清楚你想要什么,但如果目标只是编辑JSON,那么一个选项就是:

.files |= map( .date |= .[0:19] )