Recuerda que jq admite los mismos tipos de datos que JSON.
JSON describe las strings como:
Una cadena es una secuencia de cero o más caracteres Unicode, encerrada entre comillas dobles y que usa escapes con barra invertida.
Dentro de una string, usa el carácter de barra invertida para incrustar caracteres "especiales":
\" una comilla doble literal,\\ una barra invertida literal,\n, \t, \r, \f, \b
\uAAAA donde A es un dígito hexadecimalPara encontrar el número de caracteres, usa la función length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
La notación de rebanada se puede usar para extraer subcadenas.
La sintaxis es .[i:j].
La subcadena devuelta tiene longitud j - i y va desde el índice i (incluido) hasta el índice j (excluido).
Cualquiera de los índices puede ser negativo, y en ese caso se cuenta hacia atrás desde el final de la string.
Cualquiera de los índices se puede omitir, y en ese caso hace referencia al inicio o al final de la string.
Los índices empiezan en cero.
"abcdefghij"[3:6] # => "def"
"abcdefghij"[3:] # => "defghij"
"abcdefghij"[:-2] # => "abcdefgh"
Usa + para unir strings:
"Hello" + " " + "world!"
# => "Hello world!"
Usa add cuando tengas un array de strings:
["Hello", " ", "world!"] | add
# => "Hello world!"
Para dividir se usa la función split/1 o el operador /:
"Hello beautiful world!" | split(" ") # => ["Hello", "beautiful", "world!"]
"Hello beautiful world!" / " " # => ["Hello", "beautiful", "world!"]
La inversa de split/1 es join/1.
Convertir una string en un array de caracteres es algo que se necesita con frecuencia. Hay dos formas de hacerlo:
dividir por una string vacía
"Hi friend 😀" / "" # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
usar explode para obtener un array de puntos de código
"Hi friend 😀" | explode # => [72,105,32,102,114,105,101,110,100,32,128512]
implode es la inversa de explode.
Usa la función index/1; el índice empieza en cero.
"hello" | index("el")' # => 1
Si la subcadena no está en la string, el resultado es null
"hello" | index("elk") # => null
Dentro de una string, la secuencia \(expression) incrusta el resultado de esa expresión en la string:
"The current datetime is \(now | strflocaltime("%c"))" # => "The current datetime is Wed Nov 16 17:06:33 2022"
Usa las funciones ascii_downcase y ascii_upcase.
jq tiene un gran soporte para expresiones regulares: ese será el tema de una lección posterior.
En este ejercicio vas a procesar entradas de registro.
Cada línea de registro es un string con el siguiente formato: "[<LEVEL>]: <MESSAGE>".
Hay tres niveles de registro diferentes:
INFOWARNINGERRORTienes tres tareas, y cada una tomará una línea de registro y te pedirá que hagas algo con ella. Hay muchas formas de resolver estas tareas: elige tus técnicas favoritas de los ejemplos anteriores y mira qué se te ocurre.
Implementa la función message para devolver el mensaje de una línea de registro:
"[ERROR]: Invalid operation" | message
# => "Invalid operation"
Se deben eliminar los espacios en blanco que haya al principio o al final:
"[WARNING]: Disk almost full\r\n" | message
# => "Disk almost full"
Implementa la función log_level para devolver el nivel de registro de una línea de registro, el cual debe devolverse en minúsculas:
"[ERROR]: Invalid operation" | log_level
# => "error"
Implementa la función reformat que le da otro formato a la línea de registro, poniendo el mensaje primero y el nivel de registro después, entre paréntesis:
"[INFO]: Operation completed" | reformat
# => "Operation completed (info)"
Regístrate en Exercism para aprender y dominar jq con 12 conceptos75 ejercicios y mentoría humana real, todo gratis.