grep -xE '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?'
Com -x
, estamos ancorando o regexp no início e na linha para que as linhas tenham que corresponder a esse padrão como um todo, em oposição ao padrão encontrado em qualquer lugar da linha.
Se você quisesse combinar com todos os suportados por POSIX / C strtod()
como reconhecido por muitas implementações do utilitário printf
, por exemplo:
r=[$(locale decimal_point)]
d=[0-9]
h=[0-9abcdefABCDEF]
grep -xE "[[:space:]]*[-+]?($d*$r?$d+([eE][-+]?$d+)?|\
0[xX]$h*$r?$h*([pP][-+]?$d+)?|\
[iI][nN][fF]([iI][nN][iI][tT][yY])?|\
[nN][aA][nN]|\
NAN\([abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9_]+\))"
Assim também incluindo coisas como 0x3f, 0xFP-4, -Infinity, NAN (qualquer que seja).
$ printf '%g\n' 0x3f 0xFp-4 -Infinity 'NAN(whatever)'
63
0.9375
-inf
nan