Ricorda che jq supporta gli stessi tipi di dati di JSON.
JSON descrive le stringhe come:
Una stringa è una sequenza di zero o più caratteri Unicode, racchiusa tra virgolette doppie, che usa sequenze di escape con la barra rovesciata.
All'interno di una stringa, usa il carattere barra rovesciata per incorporare i caratteri «speciali»:
\" una virgoletta letterale,\\ una barra rovesciata letterale,\n, \t, \r, \f, \b
\uAAAA dove A è una cifra esadecimalePer trovare il numero di caratteri, usa la funzione length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
La notazione slice può essere usata per estrarre sottostringhe.
La sintassi è .[i:j].
La sottostringa restituita ha lunghezza j - i e restituisce i caratteri dall'indice i (incluso) all'indice j (escluso).
Entrambi gli indici possono essere negativi, nel qual caso si contano a ritroso dalla fine della stringa.
Entrambi gli indici possono anche essere omessi, nel qual caso si riferiscono all'inizio o alla fine della stringa.
Gli indici partono da zero.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
Usa + per unire le stringhe:
"Hello" + " " + "world!"
# => "Hello world!"
Usa add quando hai un array di stringhe:
["Hello", " ", "world!"] | add
# => "Hello world!"
Per dividere si usa la funzione split/1 o l'operatore /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
L'inverso di split/1 è join/1.
Spesso è necessario convertire una stringa in un array di caratteri. Ci sono due modi per farlo:
dividere su una stringa vuota
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode in un array di punti di codice
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode è l'inverso di explode.
Usa la funzione index/1; l'indice parte da zero.
"hello" | index("el")' # => 1
Se la sottostringa non è presente nella stringa, il risultato è null
"hello" | index("elk") # => null
All'interno di una stringa, la sequenza \(expression) incorpora il risultato di quell'espressione nella stringa:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Usa le funzioni ascii_downcase e ascii_upcase.
jq ha un ricco supporto per le espressioni regolari: sarà l'argomento di una lezione successiva.
In questo esercizio elaborerai voci di log.
Ogni riga di log è una stringa formattata come segue: "[<LEVEL>]: <MESSAGE>".
Ci sono tre livelli di log diversi:
INFOWARNINGERRORHai tre compiti, ciascuno dei quali prenderà una riga di log e ti chiederà di fare qualcosa con essa. Ci sono molti modi per risolvere questi compiti: scegli le tecniche che preferisci tra gli esempi qui sopra e vedi cosa riesci a mettere insieme.
Implementa la funzione message per restituire il messaggio di una riga di log:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Eventuali spazi bianchi all'inizio o alla fine vanno rimossi:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Implementa la funzione log_level per restituire il livello di log di una riga di log, che deve essere restituito in minuscolo:
"[ERROR]: Invalid operation" | log_level
# => "error"
Implementa la funzione reformat che riformatta la riga di log, mettendo prima il messaggio e poi il livello di log tra parentesi:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Iscriviti a Exercism per imparare e padroneggiare jq con 12 concetti75 esercizi e il mentoring di persone reali, tutto gratis.