2017-07-09 6 views
2

Ich versuche, ein Array in jq zu schneiden, wo das Ende Index als Argument von der Shell übergeben wird (bash):jq: array Aufschneiden basierend auf Argument

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

Dies funktioniert wie erwartet, wenn der Index hartcodierte

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

aber in dem Beispiel an der Spitze, ich erhalte eine Fehlermeldung

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

ich vermute, dies könnte mit h zu tun ow jq behandelt die Variablensubstitution innerhalb des Slice-Operators [:], aber keiner meiner Versuche, das Problem zu lösen, z.B. durch das Einschließen des Variablennamens in geschweifte Klammern .arr[0:${eidx}], hat funktioniert.

Antwort

2
  1. Sie können eine Zeichenfolge in eine Zahl umwandeln tonumber verwenden, wie in:.

jq --arg eidx 1 '.arr[0:($eidx|tonumber)]' 
  1. Wenn Ihr jq ausreichend neu ist, können Sie --argjson statt --arg:

jq --argjson eidx 1 '.arr[0:$eidx]' 
+0

--argjson hat den Job für mich getan –

1

Wenn Sie ein Argument über --arg geben es als String behandelt wird, kein int:

--arg Name Wert:

Diese Option übergibt einen Wert an das jq Programm als vordefinierte Variable. Wenn Sie jq mit --arg foo bar ausführen, ist $ foo im Programm verfügbar und hat den Wert "bar". Beachten Sie, dass der Wert als Zeichenfolge behandelt wird, sodass --arg foo 123 $ foo an "123" bindet.

Von the docs (Betonung hinzugefügt)

so scheint es, dass Sie nicht --arg verwenden können, um einen Wert zu übergeben, um in einer Scheibe verwendet werden. In diesem Beispiel könnten Sie einfach die Shell Expansion verwenden aber:

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

die doppelten Anführungszeichen wird die Shell erweitern Sie Ihre Variable haben, bevor es zu jq vorbei (wenn auch andere Erweiterungen geschehen wird, so stellen Sie sicher, dass Sie meinen, sie zu passieren

+0

Dank für den Hinweis auf Interpretation als String zurück. Shell-Erweiterung funktioniert nicht immer für komplexere jq-Befehle, weshalb ich --arg an erster Stelle –

Verwandte Themen