Ricorda che jq supporta gli stessi tipi di dato di JSON.
JSON descrive le stringhe così:
Una stringa è una sequenza di zero o più caratteri Unicode, racchiusa tra doppi apici, che usa sequenze di escape con la barra rovesciata.
Dentro una stringa, usa il carattere barra rovesciata per inserire caratteri «speciali»:
\" un doppio apice 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
Per trovare il numero di byte effettivi, usa la funzione utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
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).
Ciascuno degli indici può essere negativo, nel qual caso si conta a ritroso dalla fine della stringa.
Ciascuno degli indici può essere omesso, nel qual caso si riferisce 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 una stringa si usa la funzione split/1 oppure l'operatore /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
L'operazione inversa di split/1 è join/1.
Spesso serve 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]
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
Altre funzioni utili sono rindex/1 e indices.
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 per cambiare maiuscole e minuscole di una stringa.
Usa la funzione tonumber per creare un numero a partire da una stringa.
Questo genera un errore se la stringa non può essere convertita in un numero, quindi potrebbe servire try-catch.
$ 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"
Nota che i numeri JSON non includono le varianti esadecimali o ottali supportate da alcuni linguaggi.
Consulta il manuale per maggiori dettagli su queste funzioni:
*
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 supporta ampiamente le espressioni regolari: sarà l'argomento di una lezione successiva.