Recuerda que jq admite los mismos tipos de datos que JSON.
JSON describe las cadenas de la siguiente manera:
Una cadena es una secuencia de cero o más caracteres Unicode, encerrada entre comillas dobles y con secuencias de escape de barra invertida.
Dentro de un string, usa el carácter de barra invertida para incluir caracteres «especiales»:
\" una comilla doble literal,\\ una barra invertida literal,\n, \t, \r, \f, \b
\uAAAA, donde A es un dígito hexadecimalPara saber la cantidad de caracteres, usa la función length.
$ jq -cn --args '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7
Para saber la cantidad de bytes reales, usa la función utf8bytelength.
$ jq -cn --args '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27
La notación slice se puede usar para extraer substrings.
La sintaxis es .[i:j].
El substring devuelto tiene longitud j - i y va desde el índice i (incluido) hasta el índice j (excluido).
Cualquiera de los dos índices puede ser negativo, en cuyo caso se cuenta hacia atrás desde el final del string.
Cualquiera de los dos índices se puede omitir, en cuyo caso hace referencia al inicio o al final del 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 un string en un array de caracteres es algo que se necesita con frecuencia. Hay dos maneras de hacerlo:
dividir usando un string vacío
"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]
Usa la función index/1; el índice empieza en cero.
"hello" | index("el")' # => 1
Si el substring no está en el string, el resultado es null
"hello" | index("elk") # => null
Otras funciones útiles son rindex/1 e indices.
Dentro de un string, la secuencia \(expression) insertará el resultado de esa expresión en el 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 para cambiar las mayúsculas y minúsculas de un string.
Usa la función tonumber para crear un número a partir de un string.
Esto genera un error si el string no se puede convertir a número, así que puede que necesites 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"
Ten en cuenta que los números JSON no incluyen las variantes hexadecimales u octales que admiten algunos lenguajes.
Consulta el manual para obtener más detalles sobre estas funciones:
*
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
jq tiene un amplio soporte para expresiones regulares: este será el tema de una lección posterior.