Разрешить регулярное выражение с плавающей запятой

Как я могу проверить, является ли конкретная строка плавающей точкой? Это возможные плавающие точки:

12.245 +.0009 3.11e33 43.1E11 2e-14 

Вот что я пробовал:

 grep "^[+\-\.0-9]" grep "^[+-]*[0-9]" grep "^[+\-\.0-9]" 

И другие множество связанных вещей, но ничто не отфильтровывало что-либо вообще. Почти каждая строка прошла. Как мне решить эту проблему?

  • Фильтровать большие наборы данных в датах с командной строкой
  • Отрицательный взгляд на несколько строк
  • grep для n или более периодов на заданной строке
  • Как перенаправить вывод из команды find (использующей grep) в файл журнала?
  • Как искать файлы, где существуют два разных слова?
  • grep ключевое слово из вывода Mplayer и отправить остальное в файл
  • Tail -f передается через grep, не выводящий в файл, но выводит на консоль
  • Основная справка grep / awk - извлечение всех строк, содержащих список терминов из одного файла в отдельный файл
  • 3 Solutions collect form web for “Разрешить регулярное выражение с плавающей запятой”

     grep -xE '[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?' 

    С -x мы привязываем регулярное выражение в начале и в строке, чтобы линии соответствовали этому шаблону в целом, а не к шаблону, найденному в любом месте строки.

    Если вы хотите сопоставить все, поддерживаемые POSIX / C strtod() как это было признано многими реализациями утилиты printf например:

     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_]+\))" 

    Так же, включая такие вещи, как 0x3f, 0xFP-4, -Infinity, NAN (что угодно).

     $ printf '%g\n' 0x3f 0xFp-4 -Infinity 'NAN(whatever)' 63 0.9375 -inf nan 

    Отказ от ответственности: это несовершенное решение. Функция Scalar::Util::looks_like_number() Perl не может быть лучшим выбором для этой процедуры. См. Комментарии StéphaneChazelas ниже .

    Я оставляю его здесь, если кто-то хочет посмотреть на него и coproc из него coproc кусочки.


    Вместо того, чтобы пытаться создать собственное регулярное выражение в соответствии со многими возможными форматами чисел с плавающей запятой, используйте библиотеку, которая уже реализовала ее:

     perl -MScalar::Util -ne 'exit !Scalar::Util::looks_like_number($_)' 

    В качестве функции оболочки bash :

     is_number () { perl -MScalar::Util -ne 'exit !Scalar::Util::looks_like_number($_)' <<<"$1" } is_number hello && echo 'hello is a number' is_number 1.234 && echo '1.234 is a number' 

    Как совместный процесс bash (чтобы не запускать процесс Perl для каждого раза, когда вы хотите проверить число):

     coproc PERLIO=:raw perl -MScalar::Util -ne \ 'print Scalar::Util::looks_like_number($_) ? "Yes" : "No", "\n"' while IFS= read -r -p 'Number please: ' possnum; do printf '%s\n' "$possnum" >&${COPROC[1]} read -u ${COPROC[0]} case "$REPLY" in Yes) printf '%s is a number\n' "$possnum" ;; No) printf '%s is _not_ a number\n' "$possnum" ;; esac done kill "$COPROC_PID" 

    Или объединить два:

     coproc PERLIO=:raw perl -MScalar::Util -ne \ 'print Scalar::Util::looks_like_number($_) ? "Yes" : "No", "\n"' is_number () { printf '%s\n' "$1" >&${COPROC[1]} local REPLY read -u ${COPROC[0]} [ "$REPLY" = 'Yes' ] && return 0 return 1 } while IFS= read -r -p 'Number please: ' possnum; do if is_number "$possnum"; then printf '%s is a number\n' "$possnum" else printf '%s is a _not_ a number\n' "$possnum" fi done kill "$COPROC_PID" 

    Альтернативное решение Python (для менее сложных элементов ввода):

    Пример файла input.txt :

     11 12.245 +.0009 ---0 3.11e33 43.1E11 2e-14 t12 aaa 10.001 

    скрипт check_float.py :

     import sys with open(sys.argv[1], 'r') as inp: f = 'No' for l in inp.read().splitlines(): try: if float(l) and '.' in l: f = 'Yes' except ValueError: f = 'No' finally: print '{0} - {1}'.format(l, f) 

    Применение:

     python check_float.py input.txt 

    Выход:

     11 - No 12.245 - Yes +.0009 - Yes ---0 - No 3.11e33 - Yes 43.1E11 - Yes 2e-14 - Yes t12 - No aaa - No 10.001 - Yes 
    Linux и Unix - лучшая ОС в мире.