在我的 JSON 文档中,我有一个需要操作的字符串,然后使用“固定”值返回整个文档。
输入文档为:
{
"records" : [
{
"time": "123456789000"
},
{
"time": "123456789000"
}
]
}
我想找到“time”键并通过删除最后 3 个字符来替换字符串。生成的文档将是:
{
"records" : [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
我一直在尝试理解 jq 查询语法,但我不太明白。在过滤特定值时,我仍然在努力返回整个文档。到目前为止我所拥有的只是:
.records[] | select(.time | contains("123456789000"))
这是使用
|=
和 字符串切片 的解决方案
.records[].time |= .[:-3]
示例运行(假设数据在
data.json
中)
$ jq -M '.records[].time |= .[:-3]' data.json
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
具有 jq
sub()
功能:
jq '.records[].time |= sub("[0-9]{3}$";"")' file
输出:
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
或更简单:通过将
time
值除以 1000
:
jq '.records[].time |= (tonumber / 1000 | tostring)' file
以下适用于 jq 1.4 或更高版本:
jq '.records[].time |= .[:-3]' file.json
(表达式
.[:-3]
是.[0:-3]
的简写;这里的负整数从右开始计数。)
使用 jq 1.3,以下过滤器将在您的特定情况下工作:
.records[].time |= (tonumber | ./1000 | tostring)