es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función AWK regex split utilizando múltiples delimitadores

Estoy intentando utilizar la función split de Awk para dividir la entrada en tres campos con el fin de usar los valores como campo[1], campo[2], campo[3]. Estoy intentando extraer el primer valor: todo (incluyendo) los dos puntos, luego todo hasta el primer tabulador (\t) (el hexadecimal), luego el último campo incluirá todo lo demás.

He probado varias regex y lo más cercano que he llegado a resolver esto es:

echo -e "ffffffff81000000: 48 8d 25 51 3f 60 01\tleaq asdf asdf asdf" \
| awk '{split($0,field,/([:])([ ])|([\t])/); \
print "longitud de campo: " length(field); for (x in field) print field[x]}'

Pero el resultado no incluye los dos puntos, y no estoy seguro si es la regex correcta que he escrito:

longitud de campo: 3
ffffffff81000000
48 8d 25 51 3f 60 01
leaq asdf asdf asdf

Gracias de antemano.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en regex y awk, parece que tu regex está cerca de resolver el problema, pero aún no está ahí del todo.

    Para incluir los dos puntos en el primer campo, puedes modificar tu regex para que incluya los dos puntos en el primer grupo utilizando un grupo de captura alrededor de los dos puntos y los caracteres anteriores.

    Aquí tienes una versión modificada de tu script:

    echo -e "ffffffff81000000: 48 8d 25 51 3f 60 01\tleaq asdf asdf asdf" \
    | awk '{split($0,field,/([^:]+:)([^\t]+)\t(.*)/, \
        arr); print "longitud del campo:" length(arr); for (x in arr) print arr[x]}'
    

    En este regex, tenemos tres grupos de captura:

    1. ([^:]+:) – Coincide con todos los caracteres antes de los dos puntos (incluyendo los dos puntos).
    2. ([^\t]+) – Coincide con todos los caracteres antes de la primera tabulación.
    3. (.*) – Coincide con todo lo demás.

    Al utilizar arr en lugar de field como tercer argumento en la función split, tendremos tres elementos en el array resultante que coinciden con los tres grupos.

    Ahora, la salida debería incluir los dos puntos en el primer campo:

    longitud del campo:3
    ffffffff81000000:
    48 8d 25 51 3f 60 01
    leaq asdf asdf asdf
    

    Espero que eso ayude. Avísame si tienes alguna otra pregunta.

Comments are closed.