【问题标题】:Filtering JSON list in shell using jq使用 jq 在 shell 中过滤 JSON 列表
【发布时间】:2018-06-15 20:43:40
【问题描述】:

输入:

{ "names" : ["name1","name2","name3","pat_name4"] }

需要的输出:

{ "names" : ["name1","name2","name3"] }

目前我通过运行命令过滤掉所有以pat_开头的名称

cat file | jq .names | grep -Ev '^(pat_)'

这是

["name1","name2","name3"]

想知道是否可以对 jq 命令进行一些更改以获得所需的格式。

【问题讨论】:

  • 这个问题不是很清楚。您的数据已经是 JSON 格式。您似乎正在做的唯一更改是从数组中删除其中一个字符串。你根本没有改变格式。
  • @Barmar - OP 希望输出作为对象,而不是数组。这就是“格式”问题。但是,关于是否应排除与正则表达式匹配的所有项目的问题尚不清楚。 Sandeep - 请澄清一下。
  • 顺便说一句,cat file | jq 写成<file jqjq <filejq ... file 会更有效。对于jq 来说,性能差异并不是很大,但这是一个好习惯,因为对于其他程序来说它可能会更大——例如,对于wc -c,它是 O(1) 和一个真正的文件句柄(可以 seek()tell() 在恒定时间内),但 O(n) 使用管道。同样,sort 可以与可搜索句柄并行化,但必须使用管道从前面读取。
  • @CharlesDuffy 在这样的例子中,cat file | something 通常是 some command that produces output | something 的占位符
  • @CharlesDuffy 感谢您的意见。这只是 Barmer 指出的一个例子

标签: arrays bash shell filter jq


【解决方案1】:

根据您的输入,调用:

$ jq -c '.names |= map(select(test("^pat_")|not))' 

产生:

{"names":["name1","name2","name3"]}

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2022-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-02
    • 2018-11-09
    • 2018-10-03
    • 2016-03-02
    相关资源
    最近更新 更多