我在文本文件中有以下号码
9378123456
93700805040
0700801902
0093700809102
93711592456
3937389393
我正在尝试编写shell脚本来打印所有未使用9370
和9371
启动的数字
这是我的剧本
number="$(< all_numbers.txt)"
for numbers in $number;
do
但似乎我的if条件导致错误的输出有问题,如下所示:
if [[ (! ${numbers} =~ ^9370 ) || (! ${numbers} =~ ^9371) ]] ;
then
echo $numbers ;
fi;
done
9378123456
93700805040
0700801902
0093700809102
93711592456
3937389393
答案 0 :(得分:2)
您需要与De Morgan's formulas变得更加友好。您可能误导了&#34;所有未使用9370和9371&#34; 开头的数字:一个号码无法以9370 和 9371开头 - - 这里的意思是一个不以9370 或开头的数字,以及9371。
如果不以9370或9371开头,您想要选择打印一个数字。条件是
not ((number matches ^9370) or (number matches ^9371))
De Morgan的公式相当于
(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 :(得分:1)
对于grep
,sed
,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