【问题标题】:Bash only get the first matched result when use regexBash 在使用正则表达式时只得到第一个匹配的结果
【发布时间】:2017-07-11 11:52:11
【问题描述】:

有一个字符串示例

"j2sdk/1.8.0_25-static j2sdk/1.8.0_45 j2sdk/1.8.0_p120 j2sdk/1.8.0_40 j2sdk/1.8.0_51"

我想找到与格式j2sdk/1.8.0_xxx匹配的,但xxx只有数字,这里我想匹配下面的字符串

j2sdk/1.8.0_45 
j2sdk/1.8.0_40 
j2sdk/1.8.0_51

我写了下面的代码,但是运行时,它只得到第一个匹配的j2sdk/1.8.0_45,我的代码有什么问题吗?

avail_versions="j2sdk/1.8.0_25-static j2sdk/1.8.0_45 j2sdk/1.8.0_p120 j2sdk/1.8.0_40 j2sdk/1.8.0_51"

patern='j2sdk\/1\.8\.0_[0-9]+\s+'

if [[ $avail_versions =~ $patern ]];then
        echo matched
        echo ${BASH_REMATCH[0]}
        echo ${BASH_REMATCH[1]}
        echo ${BASH_REMATCH[2]}

fi

结果是BASH_REMATCH[0]j2sdk/1.8.0_45BASH_REMATCH[1][2]为空

我希望我能在BASH_REMATH[1],BASH_REMATH[2],BASH_REMATH[3] 得到它们。

在 Bash 中是否有其他方法可以获得预期的匹配项。

谢谢

【问题讨论】:

  • 您需要获取多个匹配项,而不是在不存在的组中查找内容(您的模式没有任何组,只有组 0,整个匹配项被初始化)。见this demo
  • 检查this snippet with grep 是否适合您。

标签: regex bash match


【解决方案1】:

我在空格处分割输入,并在每个单词后加回空格。

for s in $avail_versions ; do
    s="$s "
    if [[ $s =~ $patern ]];then
        echo ${BASH_REMATCH[0]}
    fi
done

j2sdk/1.8.0_45
j2sdk/1.8.0_40
j2sdk/1.8.0_51

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多