Tracks
/
jq
jq
/
Lehrplan
/
Strings
St

Strings in jq

6 Übungen

Über Strings

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.

Escape-Sequenzen

Innerhalb einer Zeichenkette verwendest du das Backslash-Zeichen, um „spezielle“ Zeichen einzubetten:

  • \" ein wörtliches Anführungszeichen,
  • \\ ein wörtlicher Backslash,
  • Whitespace-Zeichen \n, \t, \r, \f, \b
  • Unicode-Zeichen \uAAAA, wobei A für eine Hexadezimalziffer steht

Länge einer Zeichenkette

Um 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

Teilstrings

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"

Verkettung

Mit + verkettest du Zeichenketten:

"Hello" + " " + "world!"
# => "Hello world!"

Wenn du ein Array von Zeichenketten hast, verwendest du add:

["Hello", " ", "world!"] | add
# => "Hello world!"

Aufteilen und Zusammenfügen

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:

  1. an einer leeren Zeichenkette aufteilen

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode in ein Array von Codepoints umwandeln

    "Hi friend 😀" | explode   # => [72,105,32,102,114,105,101,110,100,32,128512]
    

    implode ist die Umkehrung von explode.

Den Index eines Teilstrings finden

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.

String-Interpolation

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"

Umwandlung der Groß-/Kleinschreibung

Mit den Funktionen ascii_downcase und ascii_upcase änderst du die Groß-/Kleinschreibung einer Zeichenkette.

Eine Zeichenkette in eine Zahl umwandeln

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.

Weitere Funktionen

Mehr Details zu diesen Funktionen findest du in dem Handbuch:

  • eine Zeichenkette wiederholen: *
  • auf Enthaltensein prüfen: contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
  • trimmen: lsrimstr/1, rtrimstr/1
  • Formatierungsfunktionen: @text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d

Reguläre Ausdrücke

jq unterstützt reguläre Ausdrücke umfassend; das ist Thema einer späteren Lektion.

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne Strings

Das Üben ist gesperrt

Schalte 8 weitere Übungen frei, um Strings zu üben