bash正则expression式匹配string
我想写一个包含一个函数,所以当给.tar
, .tar.bz2
, .tar.gz
等文件的bash脚本,它使用焦油与相关的开关解压缩文件。
我正在使用,如果ELIF然后语句testing文件名,看看它以什么结束,我不能让它匹配使用正则expression式元字符。
为了不断重写脚本,我在命令行使用'test',我认为下面的语句应该可以工作,我已经尝试了括号,引号和metacharaters的所有组合,但仍然失败。
test sed-4.2.2.tar.bz2 = tar\.bz2$; echo $? (this returns 1, false)
我敢肯定,这个问题很简单,而且我到处都是,但我无法想象如何去做。 有人知道我怎么能做到这一点?
要匹配正则expression式,您需要使用=~
运算符。
尝试这个:
[[ sed-4.2.2.tar.bz2 =~ tar.bz2$ ]] && echo matched
或者,您可以使用通配符(而不是正则expression式)和==
运算符:
[[ sed-4.2.2.tar.bz2 == *tar.bz2 ]] && echo matched
如果可移植性不是问题,我build议使用[[
而不是[
或者test
因为它更安全和更强大。 看看testing,[和[[? 了解详情。
一个function来做到这一点
extract () { if [ -f $1 ] ; then case $1 in *.tar.bz2) tar xvjf $1 ;; *.tar.gz) tar xvzf $1 ;; *.bz2) bunzip2 $1 ;; *.rar) rar x $1 ;; *.gz) gunzip $1 ;; *.tar) tar xvf $1 ;; *.tbz2) tar xvjf $1 ;; *.tgz) tar xvzf $1 ;; *.zip) unzip $1 ;; *.Z) uncompress $1 ;; *.7z) 7z x $1 ;; *) echo "don't know '$1'..." ;; esac else echo "'$1' is not a valid file!" fi }
其他注意
为了回应以上评论中的水瓶座权力, We need to store the regex on a var
在匹配expression式之后设置variablesBASH_REMATCH,并且$ {BASH_REMATCH [n]}将匹配包含在括号中的第n个组,即在以下${BASH_REMATCH[1]} = "compressed"
和${BASH_REMATCH[2]} = ".gz"
if [[ "compressed.gz" =~ ^(.*)(\.[az]{1,5})$ ]]; then echo ${BASH_REMATCH[2]} ; else echo "Not proper format"; fi
(上面的正则expression式并不意味着对文件命名和扩展是有效的,但是它适用于这个例子)
shopt -s nocasematch
if [[ sed-4.2.2.$LINE =~ (yes|y)$ ]] then exit 0 fi