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
相关产品推荐
相关产品推荐

