json - 如何将 jq 中的参数传递给 ~/.jq 点文件中定义的函数?
问题描述
目标
我正在尝试在 my 中声明函数,~/.jq
以便可以重复使用它们。我不确定我是否掌握了传递参数的正确语法。我查看了builtin.jq 源,但递归飞过了我的头。任何人都可以帮助澄清我在下面所做的方式是否正确?
注意我知道运行
jq <json.txt '...'
而不是“无用的使用 cat”更有效,但为了清楚起见,我已经这样写了,所以所有 jq 语法都在 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
解决方案
您所要做的就是grep/1
在 ~/.jq 中添加一个合适的 def。例如,您可以添加(在 之后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]
推荐阅读
- c - 读取二进制文件并确定文件类型的程序
- php - PHP(Symfony 4)rabbitmq 消费者命令作为守护进程
- camera - LWJGL 2 相机根据鼠标移动
- c++ - C++ 为多层通信设计软件架构
- algorithm - 如何检查二叉树是否是 O(nlgn) 中的 BST?
- sql-server - 检索 Jar BLOB - SQL Server
- html - 根据条件在模板中添加中间元素
- c++ - QAbstractItemModel setData - 如何检查 Qml 中的返回值
- python - 从烧瓶的视图函数返回 204 No Content
- c# - 在 OnAppearing 函数上添加延迟