grep (POSIX) регулярное выражение с плавающей запятой между пробелами в одной строке

#regex #grep #posix

#регулярное выражение #grep #posix

Вопрос:

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

 3.14 12 18.9
 

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

 8.12 1.1.1 78
 

или

 1..28 1.09 46
 

плавающая точка может отображаться как можно больше в этой единственной строке, пока допустима плавающая точка, разделенная пробелом, она вернет true / print с помощью grep (posix).

в настоящее время у меня есть регулярное выражение для grep:

 grep -E "^[[:blank:][:digit:]]*. [[:digit:]] $" FILE
 

это работает для шаблона, подобного:

 1.13 1 1.2.3 1. 1
 

но я не привык использовать шаблоны 1.2.3 и 1. 1 для соответствия, просто мне нужно 1,13 или 1 между пробелами.

примечание: мне просто нужна эта работа только в одной строке.

Ответ №1:

Вы можете использовать

 grep -E '^[0-9] (.[0-9] )?([[:blank:]][0-9] (.[0-9] )?)*

Подробные сведения:

  • ^ - начало строки
  • [0-9] - одна или несколько цифр
  • (.[0-9] )? - необязательное вхождение a . и одной или нескольких цифр
  • ([[:blank:]][0-9] (.[0-9] )?)* - ноль или более случаев
    • [[:blank:]] - табуляция или пробел
    • [0-9] (.[0-9] )? - одна или несколько цифр, за которыми следует необязательное вхождение a . и одна или несколько цифр
  • $ - конец строки.

Подробные сведения:

  • ^ — начало строки
  • [0-9] — одна или несколько цифр
  • (.[0-9] )? — необязательное вхождение a . и одной или нескольких цифр
  • ([[:blank:]][0-9] (.[0-9] )?)* — ноль или более случаев
    • [[:blank:]] — табуляция или пробел
    • [0-9] (.[0-9] )? — одна или несколько цифр, за которыми следует необязательное вхождение a . и одна или несколько цифр
  • $ — конец строки.