使用 jq 对值和 return 原始 JSON 文档执行字符串操作
Perform string manipulation on a value and return the original JSON document with jq
在我的 JSON 文档中,我有一个需要操作的字符串,然后用 'fixed' 值 return 编辑了整个文档。
输入文档为:
{
"records" : [
{
"time": "123456789000"
},
{
"time": "123456789000"
}
]
}
我想找到 "time" 键并通过删除最后 3 个字符来替换字符串。生成的文档将是:
{
"records" : [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
我一直在努力理解 jq 查询语法,但我没有理解正确。在过滤特定值时,我仍在努力 return 整个文档。到目前为止我只有:
.records[] | select(.time | contains("123456789000"))
用jqsub()
函数:
jq '.records[].time |= sub("[0-9]{3}$";"")' file
输出:
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
或者更简单:通过将 time
值除以 1000
:
jq '.records[].time |= (tonumber / 1000 | tostring)' file
这是使用 |=
和 string slicing
的解决方案
.records[].time |= .[:-3]
样本运行(假设数据在data.json
)
$ jq -M '.records[].time |= .[:-3]' data.json
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
以下适用于 jq 1.4 或更高版本:
jq '.records[].time |= .[:-3]' file.json
(表达式.[:-3]
是.[0:-3]
的简写,这里的负整数从右数开始计算。)
对于 jq 1.3,以下过滤器适用于您的特定情况:
.records[].time |= (tonumber | ./1000 | tostring)
在我的 JSON 文档中,我有一个需要操作的字符串,然后用 'fixed' 值 return 编辑了整个文档。
输入文档为:
{
"records" : [
{
"time": "123456789000"
},
{
"time": "123456789000"
}
]
}
我想找到 "time" 键并通过删除最后 3 个字符来替换字符串。生成的文档将是:
{
"records" : [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
我一直在努力理解 jq 查询语法,但我没有理解正确。在过滤特定值时,我仍在努力 return 整个文档。到目前为止我只有:
.records[] | select(.time | contains("123456789000"))
用jqsub()
函数:
jq '.records[].time |= sub("[0-9]{3}$";"")' file
输出:
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
或者更简单:通过将 time
值除以 1000
:
jq '.records[].time |= (tonumber / 1000 | tostring)' file
这是使用 |=
和 string slicing
.records[].time |= .[:-3]
样本运行(假设数据在data.json
)
$ jq -M '.records[].time |= .[:-3]' data.json
{
"records": [
{
"time": "123456789"
},
{
"time": "123456789"
}
]
}
以下适用于 jq 1.4 或更高版本:
jq '.records[].time |= .[:-3]' file.json
(表达式.[:-3]
是.[0:-3]
的简写,这里的负整数从右数开始计算。)
对于 jq 1.3,以下过滤器适用于您的特定情况:
.records[].time |= (tonumber | ./1000 | tostring)