2017-02-12 69 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