如何将 jq 中的参数传递给 ~/.jq 点文件中定义的函数?
How to pass parameters in jq to a function defined in the ~/.jq dotfile?
目标
我正在尝试在我的 ~/.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 中的函数
我在 ~/.jq
:
中定义了一个名为 grep
的函数
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
添加一个合适的 def。例如,您可以添加(在 grep/2
之后):
def grep($q): grep($q; "i");
如果您希望“i”成为默认值。 (如果愿意,您可以将默认值更改为“”,但这样您的查询将不会 return 任何 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
N.B.
将 ~/.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]
目标
我正在尝试在我的 ~/.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 中的函数
我在 ~/.jq
:
grep
的函数
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
添加一个合适的 def。例如,您可以添加(在 grep/2
之后):
def grep($q): grep($q; "i");
如果您希望“i”成为默认值。 (如果愿意,您可以将默认值更改为“”,但这样您的查询将不会 return 任何 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
N.B.
将 ~/.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]