如何在Bash中从单个字符串提取所有符合正则规则的匹配结果
原因说明
Bash 内置的正则匹配操作符 =~ 默认仅返回第一个命中的匹配结果,因此你原有代码只能拿到首个匹配项。
实现方案
方案1:使用grep(最简实现)
直接调用GNU grep的-o参数输出所有匹配项,每个结果单独占一行:
# 直接输出结果 grep -Eo '[0-9]+ chapters' <<< "$test" # 如需将结果存入变量 chapters=$(grep -Eo '[0-9]+ chapters' <<< "$test") echo "$chapters"
方案2:纯Bash实现(无外部工具依赖)
通过循环逐次匹配、截断字符串的方式获取所有结果:
tmp="$test" chapters=() # 循环匹配直到无符合规则的内容 while [[ $tmp =~ ([0-9]+ chapters) ]]; do # 把匹配结果存入数组 chapters+=("${BASH_REMATCH[1]}") # 截断字符串,删除已匹配部分之前的所有内容 tmp="${tmp#*${BASH_REMATCH[1]}}" done # 输出所有结果,每行一个 printf '%s\n' "${chapters[@]}"
内容的提问来源于stack exchange,提问作者Snake Eyes
相关产品推荐
相关产品推荐

