在文件名中查找字符串(shell脚本)

时间:2014-04-29 18:45:42

标签: regex string shell

我正在尝试使用正则表达式匹配文件名并仅提取文件名的一部分。我的文件名具有以下模式:galax_report_for_Sample11_8757.xls,我希望在这种情况下提取字符串Sample11。我尝试了以下正则表达式,但它对我不起作用,有人可以帮助正确的正则表达式吗?

name=galax_report_for_Sample11_8757.xls
sampleName=$([[ "$name" =~ ^[^_]+_([^_]+) ]] && echo ${BASH_REMATCH[2]})

编辑:

刚发现这对我有用:

sampleName=$([[ "$name" =~ ^[^_]+_([^_]+)_([^_]+)_([^_]+) ]] && echo ${BASH_REMATCH[3]})

2 个答案:

答案 0 :(得分:2)

在这种简单的情况下,你基本上只有一个值列表,每个值由一个分隔符的单个实例分隔,请考虑使用cut 来提取感兴趣的字段:

sampleName=$(echo 'galax_report_for_Sample11_8757.xls' | cut -d _ -f 4)

如果您正在使用bashzshksh,则可以提高效率:

sampleName=$(cut -d _ -f 4 <<< 'galax_report_for_Sample11_8757.xls')

答案 1 :(得分:1)

以下是您使用的方法的稍微更短的替代方法:

sampleName=$([[ "$name" =~ ^([^_]+_){3}([^_]+) ]] && echo ${BASH_REMATCH[2]})