我编写了这个正则表达式来匹配大于或等于 3600 的数字。这是我的尝试。不过,我不确定它是否完整:
grep -P '36[0-9]+[0-9]+[0-9]*' test.txt
我的意思只是正十进制整数(我不需要考虑浮点数、负数、八进制、十六进制、罗马数字......)。
答案1
([1-9][0-9]{2,}|[4-9][0-9]|3[6-9])[0-9]{2}
如果您可以确定周围没有负数、浮点数、千限制符等,则扩展正则表达式应该可以完成这项工作
该表达式具有三个路径,所有路径的共同点是最后一部分[0-9]{2}
,即两位数字。
- 第一条路径是 1 到 9,至少还有两位数字 (
[0-9]{2,}
) 和那些常见的双位数,因此所有数字都具有五位或更多位:10000 及以上 - 第二条路径是 4 到 9,再加上三位数字:4000 到 9999
- 第三条路径是 3 和 6 到 9 以及这两个数字。这匹配 3600 到 3999 之间的所有内容
答案2
正则表达式不适合比较数字!
最好使用一些脚本语言。在你的情况下awk
会做得很好:
awk -F '[^0-9]*' '{for(i=1;i<=NF;i++){ if (int($i)>3600) { print; next; } }}' test.txt
根据您的输入,您应该对此进行一些调整。
例如,我的简短示例无法正确处理负数。
答案3
使用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]
从上面的 @Phillippos 那里窃取了 5 位数字的领先数字策略。答案基本相同,但我发现这更具可读性