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

I написал это регулярное выражение для соответствия числам, большим или равным 3600. Это моя попытка. Однако я не уверен, что он полный:

grep -P '36[0-9]+[0-9]+[0-9]*' test.txt

Я имею в виду только положительные десятичные целые числа (мне не нужно рассматривать плавающие, отрицательные числа, восьмеричные, шестнадцатеричные, римские цифры...).

-1
18.05.2019, 13:42
4 ответа

Расширенное регулярное выражение ([1-9][0-9]{2,}|[4-9][0-9]|3[6-9])[0-9]{2}должно работать, если вы можете быть уверены, что вокруг нет отрицательных чисел, чисел с плавающей запятой, тысячных ограничителей и т. д.

Выражение имеет три пути, все они имеют общую последнюю часть [0-9]{2}, что означает две цифры.

  • Первый путь — это число от 1 до 9, по крайней мере, с двумя дополнительными цифрами([0-9]{2,})и этими общими цифрами twi, поэтому это все числа с пятью или более цифрами :10000 и выше
  • Второй путь — от 4 до 9 и еще три цифры :от 4000 до 9999
  • Третий путь — это 3 и что-то от 6 до 9 и эти две цифры. Это соответствует всему между 3600 и 3999
  • .
2
28.01.2020, 05:07

Регулярное выражение не годится для сравнения чисел!

Лучше использовать какой-нибудь скриптовый язык. В вашем случае awkподойдет:

awk -F '[^0-9]*' '{for(i=1;i<=NF;i++){ if (int($i)>3600) { print; next; } }}' test.txt

В зависимости от вашего мнения, вы должны немного изменить это.
Мой короткий пример, например. не работает корректно с отрицательными числами.

1
28.01.2020, 05:07

Использованиеgrep

for n in $(grep -Po "[0-9]+" test); do if [ $n -ge 3600 ]; then echo $n; fi; done

Если ваш файл содержит только целые числа , потому что он будет сообщать 5999против0.5999

Или безif

grep -Po "[1-9][0-9]{4,}|[4-9][0-9]{3}|3[6-9][0-9]{2}" test

редактировать

Украл стратегию первых цифр [1-9]для 5 цифр у @Phillippos выше. Ответы в основном такие же, хотя я нахожу это более читаемым

0
28.01.2020, 05:07

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

grep -wE '[1-9][0-9]{4,}|(3[6-9]|[4-9][0-9])[0-9]{2}'

Если числа могут начинаться с одного или нескольких нулей, используйте это:

grep -wE '0*([1-9][0-9]{4,}|(3[6-9]|[4-9][0-9])[0-9]{2})'

Или, используя PCRE:

grep -wP '0*([1-9]\d{4,}|(3[6-9]|[4-9]\d)\d{2})'
0
28.01.2020, 05:07

Теги

Похожие вопросы