json - 如何将 jq 中的参数传递给 ~/.jq 点文件中定义的函数?

标签 json command-line-arguments jq rc dotfiles

目标

我正在尝试在我的 ~/.jq 中声明函数这样它们就可以被重复使用。我不确定传递参数的语法是否正确。我看过builtin.jq source但递归却超出了我的想象。谁能帮忙澄清一下我下面的做法是否正确?

N.B. I know it's more efficient to run jq <json.txt '...' instead of the "useless use of cat", but for clarity I've written it that way so all the jq syntax is on the RHS.

源 JSON(我用作测试):

curl -s 'https://packagecontrol.io/channel_v3.json' >json.txt

不使用自定义函数的示例

这是在命令行上执行的 jq 代码:

$ cat json.txt |
jq -c --arg q "colorhelper" 'paths as $p |
  select(getpath($p)?|test($q;"i")) |
  $p'

==> ["packages_cache","https://packagecontrol.io/repository.json",625,"name"]...

~/.jq 中的函数

我定义了一个名为 grep 的函数在我的~/.jq :

def grep($q; $f):
  paths as $p |
  select(getpath($p)?|test($q;$f)) |
  $p ;

...并这样调用它:

$ cat json.txt | jq -c 'grep("colorhelper";"i")'
==> ["packages_cache","https://packagecontrol.io/repository.json",625,"name"]...

“它有效”,但我想知道如何声明该函数,以便如果省略第二个参数(在本例中为 "i" ),它仍然会成功。按原样,如果仅使用单个参数调用函数 ( jq: error: grep/1 is not defined at <top-level> ),则会引发错误

平台

  • macOS 11.2.1
  • jq 1.6(自制)
$ jq --version
jq-1.6

最佳答案

您所要做的就是在 ~/.jq 中为 grep/1 添加合适的定义。例如,您可以添加(在 grep/2 之后):

def grep($q): grep($q; "i");

如果您希望“i”成为默认值。 (如果您愿意,您可以将默认值更改为“”,但是您的查询将不会返回任何包含 json.txt 的答案。)

示例

与上面的 ~/.jq 一样:

jq -c --arg q "colorhelper" 'grep($q)' json.txt
["packages_cache","https://packagecontrol.io/repository.json",625,"name"]
["packages_cache","https://packagecontrol.io/repository.json",625,"homepage"]
["packages_cache","https://packagecontrol.io/repository.json",625,"readme"]
["packages_cache","https://packagecontrol.io/repository.json",625,"issues"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",0,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",1,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",2,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",3,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",4,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",5,"url"]
["packages_cache","https://packagecontrol.io/repository.json",625,"releases",6,"url"]

如果您还将 grep/0 定义为 def grep: grep($q); 那么您的调用就会少一些冗余:

jq -c grep --arg q colorhelper json.txt

注意

将 ~/.jq 作为文件很好,但有点过时:最近版本的 jq 有一个模块系统,它倾向于假设 ~/.jq 是一个目录。

因此,如果您的 grep/1 定义位于 ~/.jq/lib.jq 中,您会发现:

echo '["abc"]' | jq -c 'include "lib"; grep("a")'
[0]

同样:

echo '["abc"]' | jq -c 'import "lib" as lib; lib::grep("a")'
[0]

关于json - 如何将 jq 中的参数传递给 ~/.jq 点文件中定义的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66342200/

相关文章:

ruby-on-rails - 传递与 id 不同的参数以返回 JSON 用户对象的正确 Rails 路由是什么?提供 Controller 方法

java - 将 JSON 数组值存储在 HashMap 中并删除重复项

java - -J-XX 是什么意思?出现在java命令行

shell - jq - 不能用字符串索引字符串

bash - 生成包含列表中命名的 shell 变量的 JSON 映射

javascript - 格式化动态 json 数组

c# - 如何通过 C# 将字符串传递给批处理文件以及批处理文件如何接受字符串参数?

c++ - 如何在 linux 终端中处理带有负号 (-) 的 C++ 命令行参数?

json - 使用 jq,将 csv 文件转换为 json,使用 csv 文件名作为顶级对象名称

jquery - 以正确的顺序循环遍历 json 文件