【问题标题】:Multiple regex matches in one string in bash [duplicate]bash中一个字符串中的多个正则表达式匹配[重复]
【发布时间】:2021-10-05 13:27:27
【问题描述】:

我有变量

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]"

我试过了:

chapters=$([[ $test =~ ((([0-9]+) chapters)+) ]] && echo "${BASH_REMATCH[1]}")
echo $chapters

但它只返回12 chatpters,我想得到

12 chapters
4 chapters
1 chapters
...

【问题讨论】:

  • 这能回答你的问题吗? Multiple matches in a string using regex in bash
  • 如果您不需要纯 bash 解决方案,我只需使用 grep -Eo '[0-9]+ chapters' (try it here)。
  • @Aaron 这是示例输出,我编辑了帖子以添加...
  • @SnakeEyes 是的,我看到了,感谢您更新您的问题。 grep 解决方案或链接的 Q/A 是否令人满意?
  • 是的,它成功了!谢谢

标签: bash


【解决方案1】:

有关纯 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

【讨论】:

    【解决方案2】:

    如果您不需要纯 bash 解决方案,我只需使用以下 grep 调用:

    grep -Eo '[0-9]+ chapters'
    

    正则表达式匹配一个数字后跟“章节”,-E 标志启用扩展正则表达式,因此我们不需要使用原始的基本正则表达式正则表达式风格,-o 标志使grep 输出每个匹配项单独放在一行上,而不是包含至少一个匹配项的整行。

    你可以try it here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-02
      • 2017-11-09
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多