Pour rappel, 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 suite de zéro ou plusieurs caractères Unicode, encadrée par des guillemets doubles et utilisant des échappements par barre oblique inverse.
Dans une string, on utilise la 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
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 : elle contient les caractères depuis l'indice i (inclus) jusqu'à l'indice j (exclu).
Chacun des indices peut être négatif, auquel cas le comptage se fait à rebours depuis la fin de la string.
Chacun des indices 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 pour additionner un tableau de strings :
["Hello", " ", "world!"] | add
# => "Hello world!"
Pour découper une string, on 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 tableau de caractères. Pour cela, il y a deux façons de faire :
découper sur une chaîne vide
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
utiliser explode pour obtenir un tableau de codepoints
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode est l'inverse de explode.
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
Dans une string, la séquence \(expression) insère le résultat de cette expression dans la chaîne :
"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.
jq prend en charge les expressions régulières de manière très complète : ce sera le sujet d'une leçon ultérieure.
Dans cet exercice, tu vas traiter des lignes de journal.
Chaque ligne de journal est une string au format suivant : "[<LEVEL>]: <MESSAGE>".
Il existe trois niveaux de journal différents :
INFOWARNINGERRORTu as trois tâches à accomplir ; chacune prend une ligne de journal et te demande d'en faire quelque chose. Il existe de nombreuses façons de résoudre ces tâches : choisis tes techniques préférées parmi les exemples ci-dessus et vois ce que tu peux imaginer.
Implémente la fonction message pour qu'elle renvoie le message d'une ligne de journal :
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Les espaces blancs au début et à la fin doivent être supprimés :
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Implémente la fonction log_level pour qu'elle renvoie, en minuscules, le niveau indiqué dans une ligne de journal :
"[ERROR]: Invalid operation" | log_level
# => "error"
Implémente la fonction reformat, qui reformate la ligne de journal en plaçant le message en premier, suivi du niveau de journal entre parenthèses :
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Inscris-toi sur Exercism pour apprendre et maîtriser jq avec 12 concepts75 exercices, et un vrai mentorat humain, le tout gratuitement.