Regex al relleno grep seguido de flotador firmado

Regex al relleno grep seguido de flotador firmado

Quiero extraer la última columna de líneas que se ven así:

880.952         NAV_Y                uSimMarine      -146.17516

El número no siempre es negativo y no tiene una longitud fija (es decir, no siempre tiene el mismo número de decimales).

Esto me lleva la mayor parte del camino:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

Excepto que también coincide con el número de la primera columna.

Si cambio esto para incluir el final de la línea para eliminar las coincidencias de la primera columna:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

No obtengo coincidencias, lo cual no entiendo.

¿Que me estoy perdiendo aqui?

Respuesta1

Ancle la expresión al final de la línea:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

Si agrega la opción PCRE para -odevolver solo el grupo capturado, verá que su ejemplo coincide y devuelve la coincidencia deseada:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

Además, para detectar coincidencias de líneas en un archivo con espacios en blanco finales opcionales, simplemente agregue \s*como:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

Respuesta2

Precediendo a la primera expresión regular con un espacio:

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

debería funcionar, ya que excluye la coincidencia al principio de la línea.

Si quieresjustola cuarta columna, puedes lograrlo fácilmente con GNU sed:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

¿Dónde \sestá cualquier carácter de espacio en blanco (espacio, tabulación y los diversos "feeds" 1 ) y \Sun carácter que no sea un espacio, o (de una manera mucho más clara) con sed | cut:

sed 's/\s\+/\t/g' | cut -f4

que primero compacta todos los espacios en una sola pestaña y luego usa cutpara recortar la cuarta columna. También le permite elegir más columnas fácilmente, por ejemplo, con cut -f1,4, etc.

1) Es decir: avance de página, avance de línea, retorno de carro, aunque el del medio suele ser interpretado sedcomo separador de línea.

información relacionada