bash中的多个正则表达式匹配在一个字符串中



我有一个变量

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在单行上单独输出每个匹配,而不是包含至少一个匹配的整行。

你可以在这里试试。

相关内容

最新更新