Rappelle-toi que jq prend en charge les mêmes types de données que JSON.
JSON décrit les chaînes de caractères ainsi :
Une chaîne de caractères est une séquence de zéro ou plusieurs caractères Unicode, entourée de guillemets doubles et utilisant des séquences d'échappement par barre oblique inverse.
Dans une string, utilise le caractère de barre oblique inverse pour insérer des caractères « spéciaux » :
\" un guillemet double littéral,\\ une barre oblique inverse littérale,\n, \t, \r, \f, \b
\uAAAA où A est un chiffre hexadécimalPour trouver le nombre de caractères, utilise la fonction length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Pour trouver le nombre réel d'octets, utilise la fonction utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
La notation slice permet d'extraire des sous-chaînes.
La syntaxe est .[i:j].
La sous-chaîne renvoyée est de longueur j - i, et contient les caractères de l'indice i (inclus) à l'indice j (exclu).
Chaque indice peut être négatif, auquel cas il compte à rebours depuis la fin de la string.
Chaque indice peut être omis, auquel cas il désigne le début ou la fin de la string.
Les indices commencent à zéro.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
Utilise + pour concaténer des strings :
"Hello" + " " + "world!"
# => "Hello world!"
Utilise add lorsqu'on lui donne un tableau de strings :
["Hello", " ", "world!"] | add
# => "Hello world!"
Le découpage utilise la fonction split/1 ou l'opérateur / :
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
L'inverse de split/1 est join/1.
Il est souvent nécessaire de convertir une string en un tableau de caractères. Il y a deux façons de procéder :
découper sur une string vide
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode en un tableau de codepoints
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
Utilise la fonction index/1 ; l'indice commence à zéro.
"hello" | index("el")' # => 1
Si la sous-chaîne n'est pas présente dans la string, le résultat est null
"hello" | index("elk") # => null
D'autres fonctions utiles sont rindex/1 et indices.
Dans une string, la séquence \(expression) va insérer le résultat de cette expression dans la string :
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Utilise les fonctions ascii_downcase et ascii_upcase pour changer la casse d'une string.
Utilise la fonction tonumber pour créer un nombre à partir d'une string.
Cela lève une erreur si la string ne peut pas être convertie en nombre, donc try-catch peut être nécessaire.
$ 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"
Note que les nombres JSON n'incluent pas les variantes hexadécimales ou octales que certains langages prennent en charge.
Consulte le manuel pour plus de détails sur ces fonctions :
*
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 offre une prise en charge très riche des expressions régulières : ce sera le sujet d'une leçon ultérieure.