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

나는 내가 지적한 줄의 정규식을 변경하여 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

관련 정보