我需要使用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
正确的语法是什么?
答案 0 :(得分:0)
jq默认情况下从根目录文件中标记为.jq文件扩展名的隐藏文件夹中读取:〜/ .jq([“〜/ .jq”,“ $ ORIGIN /../ lib / jq”,“ $ ORIGIN /../ lib“])
要引用该模块,可以使用导入功能,然后在分号后遵循常规的jq命令。下面的“ as lib”还允许您更改名称空间的名称:
jq 'import "urldecode" as lib; .http.referrer | lib::url_decode' file.json
您可以使用-L选项覆盖.jq文件的存储位置。
答案 1 :(得分:0)
从理论上讲,通过您的设置,您应该能够按照以下方式调用jq
nodemon -q
或更简单地说:
jq 'import "url_decode" as url_decode;
.http.referrer | url_decode::url_decode' file.json
但是,在某些情况下理论并不完全适用。在这种情况下,以下变通办法应该(?)工作:将jq 'include "url_decode";
.http.referrer | url_decode' file.json
指定为命令行参数,并在模块规范中提供相对路径名。因此,在您的情况下,命令行如下所示:
-L $HOME
或:
jq -L $HOME 'import ".jq/url_decode" as url_decode; ...
答案 2 :(得分:-1)
我不确定如何在JQ中执行自定义模块,但是如果您使用bash,我建议为此使用管道传输到PERL。到目前为止,这是我发现快速对HTML实体进行url编码/解码的最简单方法,我通常将此方法与JQ结合使用
echo 'http://domain.tld/?fields={fieldname_of_type_Tab}' |
perl -MHTML::Entities -pe 'decode_entities($_)'