我有一个当前正在运行的程序,但我需要修改它以忽略一些不适合其正确功能的标准输入。
现在,运行该程序: printf "1\n3\n5\n" |程序
该程序当前忽略非整数输入(如浮点数),但是我还需要它忽略同一行上的“4 10”和“5 文本”等内容。
#! /bin/sh
sum=0;
cnt=0
while read line
do
case "$line" in
*[.]* ) #------I think here is where the regex needs to be edited
printf "\n0"
continue
;;
[0-9]* )
sum=`expr "$sum" + "$line"`
cnt=`expr "$cnt" + 1`
printf "\n%s" `expr $sum / $cnt`
;;
esac
done
我很确定这只是更改我指出的行上的正则表达式的问题,以便它转到 print 0 并继续使用我上面描述的两种非所需输入类型的情况,但我遇到了麻烦。
谢谢你!
答案1
你可以做...
while read line
do line=${line%%[!0-9]*}
[ -n "$line" ] || continue
: work w/ digits at line's head
done
或者 - 而且可能更快 - 你可以这样做:
tr -cs 0-9\\n \ |
while IFS=\ read num na
do ${num:+":"} continue
: work w/ first seq of digits on line
done
或者如果你想忽略完全地任何包含除空格、制表符或数字之外的内容的行,甚至包含两个空格分隔的数字的任何行...
b=${IFS%?}
grep "^[$b]*[0-9]\{1,\}[$b]*$" |
while read num; do : stuff with "$num"; done
你case
可以这样做:
while read num
do case ${num:--} in
*[!0-9]*) continue;;esac
: something w/ $num
done