Bourneシェル:特定の種類の標準入力を無視します。

Bourneシェル:特定の種類の標準入力を無視します。

現在実行中のプログラムがありますが、正しい機能には適していないいくつかの標準入力を無視するように変更する必要があります。

今プログラムを実行してください: printf "1\n3\n5\n" Program

プログラムは現在の整数ではない入力(浮動小数点数など)を無視しますが、また、同じ行の「4 10」や「5 text」などの項目を無視する必要があります。

#! /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

私は私が指摘した行の正規表現を変更してゼロを印刷し、上記の2つの望ましくない入力タイプを使い続けるだけでよいと確信していますが、問題があります。

ありがとうございます!

ベストアンサー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

または無視したい場合完全スペース、タブ、数字、またはスペースで区切られた2つの数字以外の項目を含む行...

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

おすすめ記事