2017-02-12 4 views
-1

Я следующее число в текстовом файлеShell оператор условия многократного использования OR

9378123456 93700805040 0700801902 0093700809102 93711592456 3937389393

Я пытаюсь написать скрипт, чтобы напечатать все числа, которые не начали с 9370 и 9371 вот мой сценарий

number="$(< all_numbers.txt)" for numbers in $number; do
if [[ (! ${numbers} =~ ^9370) || (! ${numbers} =~ ^9371) ]] ; then
echo $numbers ; fi; done
но мне кажется, я что-то неправильно в моем состоянии, если результат к неправильному выходу следующим образом:
9378123456 93700805040 0700801902 0093700809102 93711592456 3937389393

ответ

2

Вам нужно стать более дружелюбным к De Morgan's formulas. Возможно, вы ошиблись в формулировке «все номера, которые не начинаются с 9370 и 9371»: номер не может начинаться с обоих 9370 и 9371 - здесь имеется номер, который не начинается с 9370 или с 9371.

  • Вы хотите выбрать напечатать номер, если он не начинается с 9370 или 9371. это условие

    not ((number matches ^9370) or (number matches ^9371)) 
    
  • Какие формулами Де Моргана эквивалентна

    (not (number matches ^9370)) and (not (number matches ^9371)) 
    
  • Так что в вашем сценарии вы должны иметь

    if [[ (! ${numbers} =~ ^9370) && (! ${numbers} =~ ^9371) ]]; then 
        echo $numbers 
        fi 
    
  • Не говоря уже о том, что для этой проблемы игрушек вы, конечно, можете написать

    if [[ ! ${numbers} =~ ^937[01] ]]; then 
        echo $numbers 
        fi 
    
1

Это легкая работа для таких хороших инструментов, как grep, sed, awk:

Grep подход:

grep -Eo "^937[01][0-9]+$" all_numbers.txt 

СЭД подход:

sed -rn 's/^937[01][0-9]+$/\0/p' all_numbers.txt 

AWK подход:

awk '$1 ~ /^937[01][0-9]+$/' all_numbers.txt 

Выход будет:

93700805040 
93711592456 
Смежные вопросы