我正在尝试使用正则表达式匹配文件名并仅提取文件名的一部分。我的文件名具有以下模式: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]})
答案 0 :(得分:2)
在这种简单的情况下,你基本上只有一个值列表,每个值由一个分隔符的单个实例分隔,请考虑使用cut
来提取感兴趣的字段:
sampleName=$(echo 'galax_report_for_Sample11_8757.xls' | cut -d _ -f 4)
如果您正在使用bash
或zsh
或ksh
,则可以提高效率:
sampleName=$(cut -d _ -f 4 <<< 'galax_report_for_Sample11_8757.xls')
答案 1 :(得分:1)
以下是您使用的方法的稍微更短的替代方法:
sampleName=$([[ "$name" =~ ^([^_]+_){3}([^_]+) ]] && echo ${BASH_REMATCH[2]})