Bourne shell: игнорирование определенных типов stdin

У меня есть программа, которая в настоящее время работает, но мне нужно ее модифицировать, чтобы игнорировать некоторый stdin, который не подходит для его правильной функции.

Прямо сейчас, чтобы запустить программу: printf "1 \ n3 \ n5 \ n" | sh prog

В настоящее время программа игнорирует нецелый ввод (например, float), но мне также нужно игнорировать что-то вроде «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 

Я почти уверен, что это всего лишь вопрос об изменении регулярного выражения в строке, на которую я указал, чтобы она переходила к выводу 0 и продолжалась с двумя нежелательными типами ввода, описанными выше, но у меня возникают проблемы с этим.

Спасибо!

One Solution collect form web for “Bourne shell: игнорирование определенных типов stdin”

Ты можешь сделать…

 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 
  • Почему команда cd обрабатывает STDIN иначе, чем другие команды?
  • Как перенаправить ввод во время процесса?
  • vimdiff для сравнения вывода вместо файлов
  • Могу ли я подключать stdout на одном сервере к stdin на другом сервере?
  • Команды трубопровода, изменить запись stdin в stdout
  • Каталог / dev содержит системные устройства. / dev / stdin - это ссылка. На что это указывает?
  • Как использовать stdin с тройником или другими типами труб или перенаправление выходов?
  • Перенаправление stdin с stdout в файл
  • Необходимо перенаправить ввод из файла, а также из tty
  • Как заставить mplayer играть с stdin?
  • Почему некоторые команды не читаются со своего стандартного ввода?
  • Linux и Unix - лучшая ОС в мире.