代码之家  ›  专栏  ›  技术社区  ›  John S.

jq:基于参数的切片阵列

  •  4
  • John S.  · 技术社区  · 7 年前

    我试图在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 回复  |  直到 7 年前
        1
  •  6
  •   peak    7 年前
    1. 可以使用以下命令将字符串转换为数字: tonumber ,如:

    jq --arg eidx 1 '.arr[0:($eidx|tonumber)]'
    
    1. --argjson 而不是 --arg :

    jq --argjson eidx 1 '.arr[0:$eidx]'
    
        2
  •  1
  •   Eric Renouf    7 年前

    --arg

    --参数名称值:

    .

    从…起 the docs

    所以看起来你不能使用 --精氨酸

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

    双引号将使shell在将变量传递给之前展开变量 jq (虽然其他扩展也会发生,但请确保你是有意的。