I написал это регулярное выражение для соответствия числам, большим или равным 3600. Это моя попытка. Однако я не уверен, что он полный:
grep -P '36[0-9]+[0-9]+[0-9]*' test.txt
Я имею в виду только положительные десятичные целые числа (мне не нужно рассматривать плавающие, отрицательные числа, восьмеричные, шестнадцатеричные, римские цифры...).
Расширенное регулярное выражение ([1-9][0-9]{2,}|[4-9][0-9]|3[6-9])[0-9]{2}
должно работать, если вы можете быть уверены, что вокруг нет отрицательных чисел, чисел с плавающей запятой, тысячных ограничителей и т. д.
Выражение имеет три пути, все они имеют общую последнюю часть [0-9]{2}
, что означает две цифры.
[0-9]{2,}
)и этими общими цифрами twi, поэтому это все числа с пятью или более цифрами :10000 и выше Регулярное выражение не годится для сравнения чисел!
Лучше использовать какой-нибудь скриптовый язык. В вашем случае awk
подойдет:
awk -F '[^0-9]*' '{for(i=1;i<=NF;i++){ if (int($i)>3600) { print; next; } }}' test.txt
В зависимости от вашего мнения, вы должны немного изменить это.
Мой короткий пример, например. не работает корректно с отрицательными числами.
Использование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 выше. Ответы в основном такие же, хотя я нахожу это более читаемым
Если числа разделены пробелами (или в каждой строке )это регулярное выражение будет печатать только(-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})'