Bourne shell:忽略某些类型的标准输入

Bourne shell:忽略某些类型的标准输入

我有一个当前正在运行的程序,但我需要修改它以忽略一些不适合其正确功能的标准输入。

现在,运行该程序: 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

相关内容