2017-02-12 62 views
-1

我在一個文本文件中的以下數殼牌多重條件語句或

9378123456 93700805040 0700801902 0093700809102 93711592456 3937389393

我試圖寫shell腳本來打印未開始93709371 這裏所有的數字是我的腳本

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

這是一件容易的事對於grepsed,awk這樣好的工具:

的grep方法:

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

的sed方法:

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

AWK方法:

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

輸出將是:

93700805040 
93711592456