jq:基于参数切片数组

时间:2017-07-09 10:55:44

标签: json bash casting command-line-arguments jq

我正在尝试在jq中对数组进行切片,其中结束索引作为shell中的参数传递(bash):

end_index=7
cat obj.json | jq --arg eidx $end_index, '.arr[0:$eidx]'

当索引是硬编码时,这可以正常工作

cat obj.json | jq '.arr[0:7]'

但是在顶部的示例中,我收到错误消息

jq: error (at <stdin>:0): Start and end indices of an array slice must be numbers

我怀疑这可能与jq如何处理切片操作符[:]中的变量替换有关,但我没有尝试解决问题,例如通过将变量名括在花括号.arr[0:${eidx}]中,已经有效。

2 个答案:

答案 0 :(得分:2)

  1. 您可以使用tonumber将字符串转换为数字,如:
  2. jq --arg eidx 1 '.arr[0:($eidx|tonumber)]'
    
    1. 如果您的jq足够新,您可以使用--argjson代替--arg
    2. jq --argjson eidx 1 '.arr[0:$eidx]'
      

答案 1 :(得分:1)

当您通过--arg传递参数时,它被视为字符串,而不是int:

  

- arg名称值:

     

此选项将值作为预定义变量传递给jq程序。如果你使用--arg foo bar运行jq,那么$ foo在程序中可用并且值为&#34; bar&#34;。 请注意,值将被视为字符串,因此--arg foo 123会将$ foo绑定到&#34; 123&#34;

来自the docs(重点补充)

因此,您似乎无法使用--arg传递要在切片中使用的值。在此示例中,您可以使用shell扩展:

jq ".arr[0:$end_index]" obj.json

双引号将使shell扩展您的变量,然后将其传递给jq(虽然会发生其他扩展,所以请确保您的意思发生。