我试图得到一个regexp(在bash)来识别文件只有以下扩展名:tgz, tar.gz, tgz和tar.gz。我试了几个,但不能让它工作。我使用这个regexp只选择那些扩展名的文件来做一些工作:
if [ -f $myregexp ]; then
.....
fi
谢谢。
试试这个:
#!/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
我发现了一种优雅的方法:
shopt -s nocasematch
for file in *;
do
[[ "$file" =~ .*.(tar.gz|tgz)$ ]] && echo $file
done
这可能对您有好处,因为您似乎想要使用if和bash正则表达式。=~
运算符允许检查模式是否与给定表达式匹配。此外,必须将shopt -s nocasematch
设置为执行不区分大小写的匹配。
使用此模式
.*.{1}(tgz|tar.gz)
但是如何使正则表达式不区分大小写?这取决于你使用的语言。在JavaScript中,他们使用/pattern/i
,其中,i
表示搜索应该不区分大小写。在c#中,他们使用RegexOptions枚举。
取决于你想在哪里使用这个正则表达式。如果使用GREP,则使用egrep
和-i参数,它代表"忽略大小写"
egrep -i "(.tgz)|(.tar.gz)$"
写4个正则表达式,检查文件名是否匹配其中任何一个。或者写2个不区分大小写的正则表达式。
这样代码将比写一个正则表达式更容易读(也更容易)。
您甚至可以不使用正则表达式(虽然有点冗长):
for f in *.[Tt][Gg][Zz] *.[Tt][Aa][Rr].[Gg][Zz]; do
echo $f
done
In bash?使用花括号,*。{tar.gz、tgz、tar.gz tgz}甚至*。{{ar,}广州,t {ar,}广州}。因此,ls -l *.{t{ar.,}gz, t{ar.;