#!/bin/bash
filename=$1
while read first last email
do
#echo "$first" "$last" "$email"
re='[a-zA-Z]+'
if [[ "$first" =~ $re && "$last" =~ $re ]]; then
echo "$email"
else
echo "bad"
fi
done < "$filename"
我正在编写一个bash脚本,并尝试检查shell filename参数中提供的格式列表。文件的内容为
Noble Able aable@ablecorp.com
Bob builder <bob_baker@bakerandsons.com>
Chris Charley charley@bigcorp.com
Doug_douglas@maingroup.east.com
Ed Edwards edwards@inl.net.gov
kola.coe.edu Kola Jones
正如我所期望的,它应该在最后一行kola.coe.edu给出错误(打印错误),因为它有点字符,但我的结果是
aable@ablecorp.com
<bob_baker@bakerandsons.com>
charley@bigcorp.com
bad
edwards@inl.net.gov
Jones
答案 0 :(得分:2)
=~
构造中的正则表达式没有锚定(与可能让您困惑的模式不同:[[ $first == +([a-zA-Z]) ]]
)。
正则表达式匹配即使字符串的子字符串匹配它。您需要分别使用^
和$
作为字符串的开头和结尾。
[[ $first =~ ^[a-zA-Z]+$ ]]