Tracks
/
jq
jq
/
Temario
/
Strings
St

Strings en jq

6 ejercicios

Acerca de Strings

Recuerda que jq admite los mismos tipos de datos que JSON. JSON describe las cadenas de caracteres como:

Una cadena de caracteres es una secuencia de cero o más caracteres Unicode, encerrada entre comillas dobles y con secuencias de escape con barra invertida.

Secuencias de escape

Dentro de un string, usa el carácter de barra invertida para incluir caracteres «especiales»:

  • \" una comilla doble literal,
  • \\ una barra invertida literal,
  • caracteres de espacio en blanco \n, \t, \r, \f, \b
  • caracteres Unicode \uAAAA, donde A es un dígito hexadecimal

Longitud de un string

Para obtener el número de caracteres, usa la función length.

$ jq -cn --args  '$ARGS.positional[] | length' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
7

Para obtener el número real de bytes, usa la función utf8bytelength.

$ jq -cn --args  '$ARGS.positional[] | utf8bytelength' "Hello world!" "❄🌡🤧🤒🏥🕰😀"
12
27

Subcadenas

La notación slice sirve para extraer subcadenas. La sintaxis es .[i:j]. La subcadena devuelta tiene longitud j - i y devuelve los caracteres 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. También se puede omitir cualquiera de los índices, en cuyo caso se refiere al principio o al final del string. Los índices empiezan en cero.

"abcdefghij"[3:6]   # => "def"
"abcdefghij"[3:]    # => "defghij"
"abcdefghij"[:-2]   # => "abcdefgh"

Concatenación

Usa + para unir strings:

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

Usa add cuando tengas un array de strings:

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

Dividir y unir

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 función 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:

  1. dividir por un string vacío

    "Hi friend 😀" / ""   # => ["H","i"," ","f","r","i","e","n","d"," ","😀"]
    
  2. 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 función inversa de explode.

Encontrar el índice de una subcadena

Usa la función index/1; el índice empieza en cero.

"hello" | index("el")'   # => 1

Si la subcadena no está en el string, el resultado es null

"hello" | index("elk")   # => null

Otras funciones útiles son rindex/1 e indices.

Interpolación de strings

Dentro de un string, la secuencia \(expression) inserta 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"

Conversión de mayúsculas y minúsculas

Usa las funciones ascii_downcase y ascii_upcase para cambiar las mayúsculas y minúsculas de un string.

Convertir un string en un número

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 en un 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 de JSON no incluyen las variantes hexadecimales u octales que admiten algunos lenguajes.

Otras funciones

Consulta el manual para obtener más detalles sobre estas funciones:

  • repetir un string: *
  • comprobar si contiene algo: contains/1, inside/1, indices/1, index/1, rindex/1, startswith/1, endswith/1
  • recortar: lsrimstr/1, rtrimstr/1
  • funciones de formato: @text, @json, @html, @uri, @csv, @tsv, @sh, @base64, @base64d

Expresiones regulares

jq tiene un amplio soporte para expresiones regulares: este será el tema de una lección posterior.

Editar en GitHub El enlace se abre en una nueva ventana o pestaña

Aprende Strings

La práctica está bloqueada

Desbloquea 8 ejercicios más para practicar Strings