Intereting Posts
Как вывести предложение для пользователя принять и использовать в качестве входных данных? Мош не пересоединяется Узкие места в скорости USB (особенно при работе виртуальной машины) Увеличение разрешения CentOS VM сетевой менеджер не перечисляет wifi Выполнение chdir перед запуском службы systemd Узнайте, какие исходные файлы ядра были использованы при компиляции ядра Почему chfn не допускает символов не-ascii или равнозначных знаков? Как изменить размер раздела Windows без использования gparted? Скрипт для проверки использования файловой системы и свободного пространства Как выделить текст на странице руководства? Разное разрешение между каталогом и файлом с помощью 'umask' Как перечислять только каталоги, которые не находятся в подкаталоге `.git`? Конфигурация setxkbmap Как удалить структуру каталогов с помощью командной строки (или скрипта)

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 и продолжалась с двумя нежелательными типами ввода, описанными выше, но у меня возникают проблемы с этим.

Спасибо!

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

 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