Lembra-te de que o jq suporta os mesmos tipos de dados que o JSON.
O JSON descreve as strings da seguinte forma:
Uma string é uma sequência de zero ou mais carateres Unicode, delimitada por aspas duplas, com recurso a sequências de escape com barra invertida.
Dentro de uma string, usa o caráter de barra invertida para inserir carateres "especiais":
\" uma aspa dupla literal,\\ uma barra invertida literal,\n, \t, \r, \f, \b
\uAAAA, em que A é um algarismo hexadecimalPara saberes o número de carateres, usa a função length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Para saberes o número real de bytes, usa a função utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
A notação slice pode ser usada para extrair substrings.
A sintaxe é .[i:j].
A substring devolvida tem comprimento j - i, e vai do caráter no índice i (inclusive) ao índice j (exclusive).
Qualquer um dos índices pode ser negativo; nesse caso, conta a partir do fim da string.
Qualquer um dos índices pode ser omitido; nesse caso, refere-se ao início ou ao fim da string.
Os índices começam em zero.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
Usa + para juntar strings:
"Hello" + " " + "world!"
# => "Hello world!"
Usa add quando tens um array de strings:
["Hello", " ", "world!"] | add
# => "Hello world!"
Para dividir, usa a função split/1 ou o operador /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
O inverso de split/1 é join/1.
Converter uma string num array de carateres é algo de que precisas com frequência. Há duas formas de o fazer:
dividir por uma string vazia
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
usar explode para obter um array de codepoints
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
Usa a função index/1; o índice começa em zero.
"hello" | index("el")' # => 1
Se a substring não estiver na string, o resultado é null
"hello" | index("elk") # => null
Outras funções úteis são rindex/1 e indices.
Dentro de uma string, a sequência \(expression) insere o resultado dessa expressão na string:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Usa as funções ascii_downcase e ascii_upcase para alterar as maiúsculas e minúsculas de uma string.
Usa a função tonumber para criar um número a partir de uma string.
Isto gera um erro se a string não puder ser convertida num número, por isso podes precisar do 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"
Repara que os números JSON não incluem as variações hexadecimais ou octais que algumas linguagens suportam.
Consulta o manual para mais detalhes sobre estas funções:
*
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
O jq tem um grande suporte para expressões regulares: será o tema de uma aula mais adiante.