Lembre-se de que o jq dá suporte aos mesmos tipos de dados que o JSON.
O JSON descreve strings como:
Uma string é uma sequência de zero ou mais caracteres Unicode, entre aspas duplas, usando escapes com barra invertida.
Dentro de uma string, use o caractere de barra invertida para inserir caracteres "especiais":
\" uma aspa literal,\\ uma barra invertida literal,\n, \t, \r, \f, \b
\uAAAA, em que A é um dígito hexadecimalPara descobrir o número de caracteres, use a função length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Para descobrir o número de bytes de fato, use a função utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
A notação de slice pode ser usada para extrair substrings.
A sintaxe é .[i:j].
A substring retornada tem comprimento j - i, retornando caracteres do índice i (inclusive) até o índice j (exclusive).
Qualquer um dos índices pode ser negativo e, nesse caso, conta de trás para frente a partir do fim da string.
Qualquer um dos índices pode ser omitido e, 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"
Use + para concatenar strings:
"Hello" + " " + "world!"
# => "Hello world!"
Use add quando você tiver um array de strings:
["Hello", " ", "world!"] | add
# => "Hello world!"
A divisão 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 em um array de caracteres é algo de que você vai precisar com frequência. Há duas formas de fazer isso:
dividir por uma string vazia
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode em um array de pontos de código
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
Use 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"
Use as funções ascii_downcase e ascii_upcase para mudar as maiúsculas e minúsculas de uma string.
Use a função tonumber para criar um número a partir de uma string.
Isso gera um erro se a string não puder ser convertida em número, então talvez seja preciso usar 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"
Observe que números JSON não incluem as variações hexadecimais ou octais que algumas linguagens oferecem.
Consulte 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 suporte amplo a expressões regulares: esse será o assunto de uma lição mais adiante.