Tracce
/
jq
jq
/
Programma
/
Stringhe
St

Stringhe in jq

6 esercizi

Informazioni su Stringhe

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.

Sequenze di escape

Dentro una stringa, usa il carattere barra rovesciata per inserire caratteri «speciali»:

  • \" un doppio apice letterale,
  • \\ una barra rovesciata letterale,
  • caratteri di spaziatura \n, \t, \r, \f, \b
  • caratteri Unicode \uAAAA dove A è una cifra esadecimale

Lunghezza di una stringa

Per 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

Sottostringhe

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"

Concatenazione

Usa + per unire le stringhe:

"Hello" + " " + "world!"
# => "Hello world!"

Usa add quando hai un array di stringhe:

["Hello", " ", "world!"] | add
# => "Hello world!"

Dividere e unire

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:

  1. dividere su una stringa vuota

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. explode in un array di punti di codice

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

    L'operazione inversa di explode è implode.

Trovare l'indice di una sottostringa

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.

Interpolazione di stringhe

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"

Conversione di maiuscole e minuscole

Usa le funzioni ascii_downcase e ascii_upcase per cambiare maiuscole e minuscole di una stringa.

Convertire una stringa in un numero

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.

Altre funzioni

Consulta il manuale per maggiori dettagli su queste funzioni:

  • ripetere una stringa: *
  • verificare se una stringa ne contiene un'altra: contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
  • rimuovere spazi: lsrimstr/1, rtrimstr/1
  • funzioni di formattazione: @text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d

Espressioni regolari

jq supporta ampiamente le espressioni regolari: sarà l'argomento di una lezione successiva.

Modifica tramite GitHub Il collegamento si apre in una nuova finestra o scheda

Impara Stringhe

La pratica è bloccata

Sblocca 8 altri esercizi per esercitarti su Stringhe