St

Strings em jq

6 exercícios

Sobre Strings

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.

Sequências de escape

Dentro de uma string, usa o caráter de barra invertida para inserir carateres "especiais":

  • \" uma aspa dupla literal,
  • \\ uma barra invertida literal,
  • carateres de espaço em branco \n, \t, \r, \f, \b
  • carateres Unicode \uAAAA, em que A é um algarismo hexadecimal

Comprimento de uma string

Para 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

Substrings

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"

Concatenação

Usa + para juntar strings:

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

Usa add quando tens um array de strings:

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

Separar e juntar

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:

  1. dividir por uma string vazia

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. usar explode para obter um array de codepoints

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

    implode é o inverso de explode.

Encontrar o índice de uma substring

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.

Interpolação de strings

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"

Conversão de maiúsculas e minúsculas

Usa as funções ascii_downcase e ascii_upcase para alterar as maiúsculas e minúsculas de uma string.

Converter uma string num número

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.

Outras funções

Consulta o manual para mais detalhes sobre estas funções:

  • repetir uma string: *
  • testar se contém: contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
  • aparar: lsrimstr/1, rtrimstr/1
  • funções de formatação: @text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d

Expressões regulares

O jq tem um grande suporte para expressões regulares: será o tema de uma aula mais adiante.

Editar via GitHub A ligação abre numa nova janela ou separador

Aprende Strings

A prática está bloqueada

Desbloqueia mais 8 exercícios para praticares Strings