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

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

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

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

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

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

  • Строки - Извлечь версию файла Рекурсивный
  • Как проверить, присутствует ли какой-либо IP-адрес в файле с использованием сценариев оболочки?
  • grep работает в скрипте bash, но не в терминале
  • Grep -m 1 не работает
  • Сценарий оболочки для записи выбранных полей в одну строку
  • Как grep все xml-файлы, которые не начинаются с "<"
  • regexp, который соответствует всем токенам независимо от порядка
  • как grep определенная строка в случайном столбце
  • 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 
    Interesting Posts

    Неожиданный результат при использовании аргументов командной строки для поиска файла с символом

    подсчет нескольких шаблонов за один проход с помощью grep?

    Объясните пользователю Linux, как работают драйверы BSD / OSX

    Установленный coreutils на CentOS для sort -human-readable флага, но он все еще не работает

    Невозможно выполнить обмен между двумя загрузочными дисками

    Debian Stretch зависает при перезагрузке

    Как добавить столбец в определенную позицию в файле csv с помощью cat, sed, awk или cut?

    Есть ли программное обеспечение с открытым исходным кодом для имитации и практически программирования BIOS компьютера?

    перезагрузка возвращается к оригиналу

    Каталоги с двумя или более файлами

    Как я могу просто настроить температуру монитора в X?

    Каков процесс `sendmail`?

    Telnet через Ethernet для Linux?

    Команда scp не выполняет команду cp

    Как подождать файл в сценарии оболочки?

    Linux и Unix - лучшая ОС в мире.