花括号是扩展正则扩展 (ERE) 语法的一部分,而不是基本正则表达式 (BRE) 语法,因此我们需要使用“egrep”。我还冒昧地从您的正则表达式中删除了括号,因为我看到您正在寻找以结尾的文件,.EIP
所以这给我们留下了:
product="^[A-Z0-9]{2}\w[A-Z0-9]{6,7}\w[A-Z]{1}\.EIP"
我们还需要更改$IFS
变量,因为 FOR 循环使用它来确定字段分隔符。默认情况下,字段分隔符设置为空格字符,这不适用于字段分隔符可以是字符串一部分的字符串(即,如果文件名包含空格)。我们将 IFS 的当前值存储到一个变量中并设置 IFS:
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
完成后,我们将 IFS 恢复到其原始值:
IFS=$SAVEIFS
现在我们将文件名通过管道传递给 egrep 并使用我们的正则表达式进行过滤,同时将stdout
和重定向stderr
到/dev/null
. 该$?
变量将让我们知道 egrep 是否返回了匹配项。
echo $file | egrep $product &>/dev/null
if [ $? -eq 0 ]; then
echo "$file - acceptable"
else
echo "$file - not acceptable"
fi
这是完整脚本的样子(在山狮上测试):
#!/bin/bash
product="^[A-Z0-9]{2}\w[A-Z0-9]{6,7}\w[A-Z]{1}\.EIP"
FILES_LIST="$(ls *.EIP)"
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
for file in $FILES_LIST; do
echo $file | egrep $product &>/dev/null
if [ $? -eq 0 ]; then
echo "$file - acceptable"
#move files, create log
else
echo "$file - not acceptable"
#move files to an error folder for renaming
fi
done
IFS=$SAVEIFS
exit 0
请注意,您可以通过使用多个语句块和最后一个条件来检查是否符合N命名约定,如下所示:if
else
for file in $FILES_LIST; do
echo $file | egrep $regex1 &>/dev/null
if [ $? -eq 0 ]; then
echo "$file - accepted by regex1"
#move files, create log
continue
fi
echo $file | egrep $regex2 &>/dev/null
if [ $? -eq 0 ]; then
echo "$file - accepted by regex2"
#move files, create log
continue
fi
echo $file | egrep $regexN &>/dev/null
if [ $? -eq 0 ]; then
echo "$file - accepted by regexN"
#move files, create log
else
echo "$file - not acceptable"
#move files to an error folder for renaming
fi
done
注意使用,continue
因为它恢复了循环的迭代for
,允许每个文件只执行一个操作(考虑文件名符合超过 1 个命名约定)