Parcours
/
jq
jq
/
Programme
/
Chaînes de caractères
Ch

Chaînes de caractères en jq

6 exercices

À propos de Chaînes de caractères

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.

Séquences d'échappement

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,
  • les caractères d'espacement \n, \t, \r, \f, \b
  • les caractères Unicode \uAAAA où A est un chiffre hexadécimal

Longueur d'une string

Pour 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

Sous-chaînes

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"

Concaténation

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!"

Découpe et assemble

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 :

  1. découper sur une string vide

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode en un tableau de codepoints

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

    implode est l'inverse de explode.

Trouve l'indice d'une sous-chaîne

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.

Interpolation de strings

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"

Conversion de casse

Utilise les fonctions ascii_downcase et ascii_upcase pour changer la casse d'une string.

Convertis une string en nombre

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.

Autres fonctions

Consulte le manuel pour plus de détails sur ces fonctions :

  • répéter une string : *
  • tester l'inclusion : contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
  • supprimer les espaces : lsrimstr/1, rtrimstr/1
  • fonctions de formatage : @text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d

Expressions régulières

jq offre une prise en charge très riche des expressions régulières : ce sera le sujet d'une leçon ultérieure.

Modifie via GitHub Le lien s'ouvre dans une nouvelle fenêtre ou un nouvel onglet

Apprends Chaînes de caractères

L'entraînement est verrouillé

Déverrouille 8 exercices de plus pour t'entraîner sur Chaînes de caractères