我试图获取正则表达式(在bash中)来识别仅具有以下扩展名的文件: tgz,tar.gz,TGZ和TAR.GZ. 我试过几个,但不能让它工作。 我正在使用此正则表达式仅选择具有这些扩展名的文件文件,以便与它们一起使用:
if [ -f $myregexp ]; then
.....
fi
感谢。
答案 0 :(得分:4)
试试这个:
#!/bin/bash
# no case match
shopt -s nocasematch
matchRegex='.*\.(tgz$)|(tar\.gz$)'
for f in *
do
# display filtered files
[[ -f "$f" ]] && [[ "$f" =~ "$matchRegex" ]] && echo "$f";
done
答案 1 :(得分:1)
我找到了一种优雅的方式:
shopt -s nocasematch
for file in *;
do
[[ "$file" =~ .*\.(tar.gz|tgz)$ ]] && echo $file
done
这可能对你有好处,因为你似乎想要使用if和bash正则表达式。 =~
运算符允许检查模式是否与给定表达式匹配。此外,shopt -s nocasematch
必须设置为不区分大小写的匹配。
答案 2 :(得分:0)
编写4个正则表达式,并检查文件名是否与其中任何一个匹配。或者编写2个不区分大小写的正则表达式。
这样,代码将比编写1个正则表达式更易读(也更容易)。
答案 3 :(得分:0)
使用此模式
.*\.{1}(tgz|tar\.gz)
但是如何使正则表达式不区分大小写?这取决于您使用的语言。在JavaScript中,他们使用/pattern/i
,其中i
表示搜索应该不区分大小写。在C#中,他们使用RegexOptions枚举。
答案 4 :(得分:0)
取决于您要使用此正则表达式的位置。如果使用GREP,则使用egrep
和-i参数,它代表“忽略大小写”
egrep -i "(\.tgz)|(\.tar\.gz)$"
答案 5 :(得分:0)
你甚至可以在没有正则表达式的情况下做到这一点(虽然有点罗嗦):
for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
echo $f
done
答案 6 :(得分:0)
在 bash 中?使用大括号,*.{tar.gz,tgz,TAR.GZ,TGZ} 甚至 *.{t{ar.,}gz,T{AR.,}GZ}。因此,命令行上的 ls -l *.{t{ar.,}gz,T{AR.,}GZ} 将详细列出所有具有匹配扩展名的文件。