如何使用jq提取json值的子字符串

9

我有一个JSON:

{"temperature":"21", "humidity":"12.3", "message":"Today ID 342 is running"}

我希望使用 jq 从以下 JSON 中获取数据:

{"temp":"21", "hum":"12.3", "id":"342"}

如您所见,我想要做的是提取 ID 编号 342,并将其放入新的 JSON 中并给它一个不同的键名。我认为应该使用正则表达式,但我不知道如何在 jq 语法中插入它。

我可以使用基本命令创建另一个 JSON:

cat old.json | jq '{temp:.temperature,hum:.humidity, id:.message}' > new.json

我知道可以使用方括号选择子字符串,但是我不想使用它们,因为它们不考虑具有不同长度和结构的字符串。我想使用正则表达式,因为我知道ID编号始终在“ID”部分之后。


建议使用<old.json而不是cat old.json。这在使用jq时只是一个小差别,但对于那些受益于能够使用seek()tell()从文件的不同部分读取、跳到末尾、在线程之间并行操作、以常数时间测量长度或执行任何其他可以使用真实文件句柄但无法使用FIFO的操作的命令来说,性能差异可能会很大。 - Charles Duffy
例如,cat foo | wc -c 将从开头读取 foo 的所有内容,但 <foo wc -c 根本不会读取文件的任何内容,而是直接跳到结尾并执行一个常数时间操作来请求其当前位置。同样,GNU sort 可以将对大型文件的排序并行化为每个处理子集的子进程,并合并它们的结果--但如果给它提供一个要读取的管道,则输入读取过程根本无法并行化! - Charles Duffy
1个回答

13

你说的没错,这里需要使用正则表达式。幸运的是,jq手册有一大节介绍了如何使用它们。

jq '
{
  temp: .temperature,
  hum: .humidity,
  id: (.message | capture("ID (?<id>[[:digit:]]+)").id)
}' <old.json >new.json

你可以使用你的示例数据在 https://jqplay.org/s/k-ZylbOC6W 上查看它的运行情况。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接