2016-03-02 82 views
0

我正在编写脚本,并且遇到了正确的子字符串值问题。解析Bash中的文件名

文件名是Package-amd64-3.0.11.deb。我需要从这个名字中提取“3.0.11”,但是当我使用子字符串时,我不知道如何正确预测字符的数量(如果我有一个版本为3.0.9的文件,会中断)

fName="/etc/deb/Package-amd64-3.0.11.deb" 
version="${fName:23:29}" 
+0

'[ “/etc/deb/Package-amd64-3.0.11.deb”=〜[0- 9] + \。[0-9] + \。[0-9] +]] && echo“$ {BASH_REMATCH [0]}”'或类似的东西。 – Biffen

回答

2

两个步骤。首先,剥去一切直到并包括最后-

version=${fName##*-} 

接着,剥去延伸:

version=${version%.deb} 

这应该是针对在包名称的变化合理弹性的,并且可以容易地,如果被修改必要。

1

这可能比较容易除去已知的后缀,前缀:

fName="/etc/deb/Package-amd64-3.0.11.deb" 
version="${fName%.deb}" 
version="${version##*-}" 
1

使用sed

fName="/etc/deb/Package-amd64-3.0.11.deb" 
sed -E 's/.*-(.+)\.[^.]*$/\1/' <<< "$fName" 

3.0.11 

使用awk的,你可以这样做:

awk -F- '{sub(/\.[^.]*$/, ""); print $NF}' <<< "$fName" 

3.0.11