【发布时间】:2016-07-01 19:21:19
【问题描述】:
我编写了一个 bash 脚本,该脚本将读取参数中已提供的文本文件,并处理文本并将错误重定向到错误文件,并将其他输出重定向到 list.txt 文件。
#!/bin/bash
filename="$1"
while read line; do
a=$(echo $line | awk "{print NF}")
if [ "$a" = "3" ]
then
first=$(echo $line | awk -F' ' '{print $1}')
last=$(echo $line | awk -F' ' '{print $2}')
email=$(echo $line | awk -F' ' '{print $3}')
if [[ $first =~ ^[a-zA-Z]+$ && $last =~ ^[a-zA-Z]+$ ]]
then
if [[ $email =~ '<([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}>' ]]
then
echo "$first $last $email" | cat >>list.txt
elif [[ $email =~ '([\w\.\-_]+)?\w+@[\w-_]+(\.\w+){1,}' ]]
then
echo "$first $last <$email>" | cat >>list.txt
else
echo "$first $last $email" | cat >&2
fi
else
echo "$first $last $email" | cat >&2
fi
else
echo "$line" | cat >&2
fi
done < $filename
我将此代码作为 $./script.sh argumentfile.txt 2>error.txt
运行我的参数文件有以下信息
Joe cable cable@ablecorp.com
Bob Brown <bob_baker@bakerandsons.com>
Jim Hass hass@bigcorp.com
mike_lupo@mou.east.com
Edison jones jones@inl.net.gov
pirate.coe.su.com pirate people
文件的理想形式应为(故意格式错误)
lastname firstname <email>
在错误文件中我得到的是
Joe cable cable@ablecorp.com
Bob Brown <bob_baker@bakerandsons.com>
Jim Hass hass@bigcorp.com
mike_lupo@mou.east.com
Edison jones jones@inl.net.gov
pirate.coe.su.com pirate people
【问题讨论】:
-
echo ... | cat毫无意义。您不需要管道或cat。 -
将
set -x添加到您的脚本中,以便您查看实际运行的内容并尝试找出不匹配的模式,然后您可能会找出原因。 -
您的正则表达式似乎有问题,使用命令检查它 - [[ $email =~ $reg ]] && echo "yes!"
标签: regex bash shell unix scripting