我有一个变量
test="PlayLists: 00001.mpls 01:32:39 [12 chapters] 00005.mpls 00:19:37 [4 chapters] 00003.mpls 00:08:56 [1 chapters] 00004.mpls 00:00:39 [1 chapters] 00006.mpls 00:00:29 [2 chapters] 00007.mpls 00:00:25 [2 chapters] 00000.mpls 00:00:23 [1 chapters]"
I tried with:
chapters=$([[ $test =~ ((([0-9]+) chapters)+) ]] && echo "${BASH_REMATCH[1]}")
echo $chapters
但是它只返回12 chatpters
,我想要得到
12 chapters
4 chapters
1 chapters
...
请参见下面的纯bash解决方案示例。
示例脚本:
# cat foo.sh
shopt -s extglob
var='[12 chapters][13 chapters][14 chapters]'
while [[ $var =~ ([0-9]+ chapters) ]]; do
echo "${BASH_REMATCH[1]}"
var=${var#*+([0-9]) chapters}
done
结果:
# bash foo.sh
12 chapters
13 chapters
14 chapters
如果您不需要纯bash解决方案,我将简单地使用以下grep
调用:
grep -Eo '[0-9]+ chapters'
正则表达式匹配后跟"chapters"的数字,-E
标志启用扩展正则表达式,因此我们不需要使用预期的基本正则表达式正则表达式风格,-o
标志使grep
在单行上单独输出每个匹配,而不是包含至少一个匹配的整行。
你可以在这里试试。