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 e recorrendo a sequências de escape com barra invertida.
Dentro de uma string, usa a barra invertida para introduzir carateres "especiais":
\" uma aspa 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
A notação de slice pode ser usada para extrair substrings.
A sintaxe é .[i:j].
A substring devolvida tem comprimento j - i e vai buscar os carateres desde o índice i (inclusive) até ao índice j (exclusive).
Qualquer dos índices pode ser negativo; nesse caso, conta de trás para a frente a partir do fim da string.
Qualquer 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 o + 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.
É frequente precisares de converter uma string num array de carateres. Há duas formas de o fazer:
dividir por uma string vazia
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
explode num array de codepoints
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode é o inverso de explode.
Usa a função index/1; o índice começa em zero.
"hello" | index("el")' # => 1
Se a substring não existir na string, o resultado é null
"hello" | index("elk") # => null
Dentro de uma string, a sequência \(expression) incorpora 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.
O jq tem um grande suporte para expressões regulares: este será o tema de uma lição mais à frente.
Neste exercício vais processar entradas de registo.
Cada linha de registo é uma string com o seguinte formato: "[<LEVEL>]: <MESSAGE>".
Há três níveis de registo diferentes:
INFOWARNINGERRORTens três tarefas, cada uma delas recebe uma linha de registo e pede-te para fazer algo com ela. Há muitas formas de resolver estas tarefas. Escolhe as tuas técnicas preferidas dos exemplos acima e vê o que consegues fazer.
Implementa a função message para devolver a mensagem de uma linha de registo:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Quaisquer espaços em branco no início ou no fim devem ser removidos:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Implementa a função log_level para devolver o nível de registo de uma linha de registo, que deve ser devolvido em minúsculas:
"[ERROR]: Invalid operation" | log_level
# => "error"
Implementa a função reformat que reformula a linha de registo, colocando a mensagem primeiro e o nível de registo depois dela, entre parênteses:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Inscreve-te no Exercism para aprenderes e dominares jq com 12 conceitos75 exercícios, e mentoria humana real, tudo grátis.