Bourne shell: ignorando certos tipos de stdin

1

Eu tenho um programa que está atualmente funcionando, mas eu preciso modificá-lo para ignorar algum stdin que não é adequado para sua função correta.

Agora, para executar o programa: printf "1 \ n3 \ n5 \ n" | sh prog

O programa atualmente ignora a entrada não-inteira (como floats), mas eu também preciso que ela ignore algo como '4 10' na mesma linha e '5 text' etc.

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

Tenho certeza que é apenas uma questão de alterar o regex na linha que eu apontei para que ele vá para a impressão 0 e continue com os dois tipos de entrada não desejados que descrevi acima, mas estou tendo problemas com isso.

Obrigado!

    
por user3295674 25.03.2015 / 04:27

1 resposta

0

Você pode fazer ...

while read line
do    line=${line%%[!0-9]*}
      [ -n "$line" ] || continue
      : work w/ digits at line's head
done

Alternativamente - e provavelmente mais rápido - você pode fazer:

tr -cs 0-9\n \ |
while IFS=\  read num na
do    ${num:+":"} continue
      : work w/ first seq of digits on line
done

Ou se você quiser ignorar completamente qualquer linha que contenha qualquer coisa, exceto espaços, tabulações ou números, ou até mesmo qualquer linha que contenha dois números separados por espaço ...

b=${IFS%?}
grep "^[$b]*[0-9]\{1,\}[$b]*$" |
while read num; do : stuff with "$num"; done

Com case você poderia fazer assim:

while read num
do    case ${num:--} in 
      *[!0-9]*) continue;;esac
      : something w/ $num
done
    
por 25.03.2015 / 04:37