module - jq中调用自定义模块的格式是什么?
问题描述
我需要使用 jq 对 json 结构中的字符串进行 url 解码。我在 ~/.jq/urldecode.jq 下定义了一个自定义模块,但是在调用它时:
jq '.http.referrer | url_decode::url_decode' file.json
我收到错误消息:
jq: 1 compile error
模块源码为:
def url_decode:
# The helper function converts the input string written in the given
# "base" to an integer
def to_i(base):
explode
| reverse
| map(if 65 <= . and . <= 90 then . + 32 else . end) # downcase
| map(if . > 96 then . - 87 else . - 48 end) # "a" ~ 97 => 10 ~ 87
| reduce .[] as $c
# base: [power, ans]
([1,0]; (.[0] * base) as $b | [$b, .[1] + (.[0] * $c)]) | .[1];
. as $in
| length as $length
| [0, ""] # i, answer
| until ( .[0] >= $length;
.[0] as $i
| if $in[$i:$i+1] == "%"
then [ $i + 3, .[1] + ([$in[$i+1:$i+3] | to_i(16)] | implode) ]
else [ $i + 1, .[1] + $in[$i:$i+1] ]
end)
| .[1]; # answer
什么是正确的语法?
解决方案
理论上,通过您的设置,您应该能够按照以下方式调用 jq
jq 'import "urldecode" as url_decode;
.http.referrer | url_decode::url_decode' file.json
或更简单地说:
jq 'include "urldecode";
.http.referrer | url_decode' file.json
然而,在某些情况下,理论并不完全适用。在这种情况下,jq 1.5 和 1.6 可以使用以下解决方法:
(1) 指定-L $HOME
为命令行参数,并在模块规范中给出相对路径名。因此,在您的情况下,命令行如下所示:
jq -L $HOME 'import ".jq/urldecode" as url_decode; ...
或者:
jq -L $HOME 'include ".jq/urldecode"; ...
(2) 使用 {search: _} 功能,例如
jq 'include "urldecode" {search: "~/.jq"} ; ...' ...
jq 'import "urldecode" as url_decode {search: "~/.jq"} ; ...' ...
推荐阅读
- angular - 如何在角度设置属性值
- javascript - 试图理解新的 Promise 和 Async/await
- python - 安装与 python 3.7.4 兼容的旧虚拟环境?
- php - 在 opencart v3.0.3.2 中设置 payTM 插件时出错
- python - 使用 Flask 和 HTML 的开/关按钮动作控制
- performance - Janusgraph(GremlinServer) 导入提高性能
- sql - 根据另一个表数据创建另一个表和列
- sql - 'FORMAT' 不是可识别的内置函数名称。- SQL 服务器
- java - Java中的堆栈线程是什么?
- interface - 如何在 UML 中显示接口和类之间的关系?