Extracción de numbers de punto flotante positivo / negativo de una cadena

Estoy tratando de extraer numbers de algún text. Actualmente estoy usando lo siguiente:

echo "2.5 test. test -50.8" | tr '\n' ' ' | sed -e 's/[^0-9.]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' ' 

Esto me daría 2.5, ". y 50.8. ¿Cómo debo modificar el primer sed para que detecte los numbers de flotación, tanto positivos como negativos?

grep funciona bien para esto:

 $ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' 2.5 -50.8 

Cómo funciona

  • -E

    Usa expresiones regulares extendidas

  • -o

    Devuelve solo las coincidencias, no el context

  • [+-]?[0-9]+([.][0-9]+)?+

    Los numbers del partido que se identifican como:

    • [+-]?

      Un signo principal opcional

    • [0-9]+

      Uno o más numbers

    • ([.][0-9]+)?

      Un período opcional seguido de uno o más numbers.

Obtener la salida en una línea

 $ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' | tr '\n' ' '; echo "" 2.5 -50.8 

Una solución grep :

 $ echo "2.5 test. test -50.8" | tr ' ' '\n' | grep -E '^[+-]?[0-9]*\.?([0-9]+)$' 2.5 -50.8 
  • El tr simplemente convierte la línea en varias líneas al replace los espacios por líneas nuevas.

  • El command grep busca cadenas que comiencen con un + o - opcional, posiblemente seguido de algunos dígitos y un punto decimal opcional. Entonces necesitamos algunos dígitos al final.

Esto permitirá cosas como 00000123.91288000 , que simplemente se ve extraño. ¿Es este un número que queremos filtrar o no? Es técnicamente un número de punto flotante, simplemente formateado de forma extraña.

EDITAR : Para verificar correctamente los numbers, ¡ no escriba su propia expresión regular! Use una rutina de biblioteca de algún lugar confiable.

En mi caso, usaría el package Scalar::Util Perl, que tiene una conveniente subrutina looks_like_number() :

 $ echo "2.5 test. test -50.8" | tr ' ' '\n' | perl -MScalar::Util -ne 'Scalar::Util::looks_like_number($_) && print' 2.5 -50.8 

Esto tiene el beneficio adicional de encontrar numbers en otras forms, como 1e3 .