Tudo se resume ao que você realmente quer considerar um número científico , o que você pode esperar que sua entrada contenha e onde você pode aceitar encontrar esses números na entrada.
Por exemplo, em:
That's inferior to the LK2E2000 model.
Eu posso encontrar números 0 ou 2 (inf e 2E2000) ou 3 (inf, 2E200, 0) (ou levado ao extremo, procurando todas as seqüências de caracteres que formam um número válido: 17 (inf, 2) , 2E2, 2E20, 2E200, 2E200, 2E2000, 2, 20, 200, 2000, 0, 00, 000, 0, 00, 0)).
Se você sabe que sua entrada tem apenas números no X.XXXXXXXXE-XXX, e que eles têm palavras próprias, pode ser mais seguro procurar apenas por palavras como:
tr -s '[[:blank:]]' '[\n*]' | LC_ALL=C grep -xEc '[0-9]\.[0-9]{8}E-[0-9]{3}'
A idéia é obter uma palavra por linha e igualar a linha inteira ( -x
) com o padrão que você deseja. Para permitir qualquer número de notação científica (-1.2e + 1234 ... desde que haja um e
ou E
), você pode alterar o padrão para:
[-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9])[eE][-+]?[0-9]+
Ou torne a parte e...
opcional para permitir todos os tipos de números de ponto flutuante decimais:
[-+]?([0-9]+\.[0-9]*|[0-9]*\.[0-9])([eE][-+]?[0-9]+)?
Isso tudo dá a mesma resposta para sua entrada específica, mas onde isso faria diferença é onde há uma entrada que se afasta do padrão estrito mostrado em sua amostra.