Zur Erinnerung: jq unterstützt dieselben Datentypen wie JSON.
JSON beschreibt Zeichenketten wie folgt:
Eine Zeichenkette ist eine Folge von null oder mehr Unicode-Zeichen, die in doppelte Anführungszeichen eingeschlossen wird und Backslash-Escapes verwendet.
Innerhalb einer Zeichenkette verwendest du das Backslash-Zeichen, um „spezielle“ Zeichen einzubetten:
\" ein wörtliches Anführungszeichen,\\ ein wörtlicher Backslash,\n, \t, \r, \f, \b
\uAAAA, wobei A für eine Hexadezimalziffer stehtUm die Anzahl der Zeichen zu ermitteln, verwendest du die Funktion length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Um die Anzahl der tatsächlichen Bytes zu ermitteln, verwendest du die Funktion utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
Mit der Slice-Notation kannst du Teilstrings extrahieren.
Die Syntax ist .[i:j].
Der zurückgegebene Teilstring hat die Länge j - i und enthält die Zeichen von Index i (inklusive) bis Index j (exklusiv).
Jeder der beiden Indizes kann negativ sein; dann zählt er vom Ende der Zeichenkette rückwärts.
Jeder Index kann auch weggelassen werden; dann steht er für den Anfang oder das Ende der Zeichenkette.
Die Indizes sind nullbasiert.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
Mit + verkettest du Zeichenketten:
"Hello" + " " + "world!"
# => "Hello world!"
Wenn du ein Array von Zeichenketten hast, verwendest du add:
["Hello", " ", "world!"] | add
# => "Hello world!"
Zum Aufteilen verwendest du die Funktion split/1 oder den Operator /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
Die Umkehrung von split/1 ist join/1.
Oft musst du eine Zeichenkette in ein Array von Zeichen umwandeln. Dafür gibt es zwei Möglichkeiten:
an einer leeren Zeichenkette aufteilen
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode in ein Array von Codepoints umwandeln
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
Verwende die Funktion index/1; der Index ist nullbasiert.
"hello" | index("el")' # => 1
Wenn der Teilstring nicht in der Zeichenkette vorkommt, ist das Ergebnis null.
"hello" | index("elk") # => null
Weitere nützliche Funktionen sind rindex/1 und indices.
Innerhalb einer Zeichenkette bettet die Sequenz \(expression) das Ergebnis dieses Ausdrucks in die Zeichenkette ein:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Mit den Funktionen ascii_downcase und ascii_upcase änderst du die Groß-/Kleinschreibung einer Zeichenkette.
Mit der Funktion tonumber erzeugst du aus einer Zeichenkette eine Zahl.
Das löst einen Fehler aus, wenn sich die Zeichenkette nicht in eine Zahl umwandeln lässt, daher kann try-catch nötig sein.
$ jq -cn --args '$ARGS.positional[] | [., tonumber]' 42 3.14 oops 1e6 0xbeef
["42",42]
["3.14",3.14]
jq: error (at <unknown>): Invalid numeric literal at EOF at line 1, column 4 (while parsing 'oops')
$ echo $?
5
$ jq -cn --args '$ARGS.positional[] | try [., tonumber] catch "not a number"' 42 3.14 oops 1e6 0xbeef
["42",42]
["3.14",3.14]
"not a number"
["1e6",1000000]
"not a number"
Beachte, dass JSON-Zahlen keine Hex- oder Oktalvarianten kennen, die manche Sprachen unterstützen.
Mehr Details zu diesen Funktionen findest du in dem Handbuch:
*
contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
lsrimstr/1, rtrimstr/1
@text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d
jq unterstützt reguläre Ausdrücke umfassend; das ist Thema einer späteren Lektion.