You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Shell脚本提取文件内最大正数异常,如何调整grep匹配规则?

问题原因

你编写的greater函数问题出在正则匹配规则:原有正则[0-9]*仅匹配连续数字字符,会把负数去掉负号后的数字部分也单独提取出来(比如-100会被识别出100纳入正整数排序),因此会错误引入负数的绝对值参与排序。另外原有写法中$1没有加引号,遇到带空格的文件名会报错,也可以同步优化。

修正方案

只需调整greater函数的匹配规则,仅提取前面没有负号的正整数即可,这里给出两种兼容不同环境的写法:

写法1:兼容所有POSIX标准grep(适配所有Unix-like环境)

function greater {
  # 先匹配前面不是负号的数字序列,再单独提取数字部分过滤掉前置非负号字符
  grep -Eo '(^|[^-])[0-9]+' "$1" | grep -Eo '[0-9]+' | sort -rn | head -n 1
}

function lesser {
  grep -Eo '\-[0-9]+' "$1" | sort -n | head -n 1
}

写法2:GNU grep环境可用(写法更简洁,大部分Linux发行版默认支持)

function greater {
  # 用负向后行断言直接匹配前面不带负号的正整数
  grep -Po '(?<!-)\b\d+\b' "$1" | sort -rn | head -n 1
}

function lesser {
  grep -Eo '\-[0-9]+' "$1" | sort -n | head -n 1
}

验证说明

用你给出的样例输入测试,两种写法的greater函数都会仅匹配95、10、500、400、300、200、600这些正整数,排序后返回最大值600,lesser函数保持原有逻辑正常返回-100,完全符合预期输出。

内容的提问来源于stack exchange,提问作者Takuya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 19:36:03