正则表达式用于字母没有失败的点

时间:2016-03-14 10:54:50

标签: regex bash shell unix scripting

#!/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

1 个答案:

答案 0 :(得分:2)

=~构造中的正则表达式没有锚定(与可能让您困惑的模式不同:[[ $first == +([a-zA-Z]) ]])。

正则表达式匹配即使字符串的子字符串匹配它。您需要分别使用^$作为字符串的开头和结尾。

[[ $first =~ ^[a-zA-Z]+$ ]]