【问题标题】:regex - split string正则表达式 - 拆分字符串
【发布时间】:2020-11-01 00:55:58
【问题描述】:

我需要将带有文件名的字符串分成5个部分,如下例所示:

#!/usr/bin/env bash

str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"
pkg_re='(.+)-[^-]+-[0-9]+-([^.]+)\.chi.zst*'

[[ $str =~ $pkg_re ]] &&
   pkg_base = ${BASH_REMATCH[1]}
   pkg_arch = ${BASH_REMATCH[2]}

echo $pkg_base
echo $pkg_arch

块必须如下:

block 1 - python-zope-proxy # pkg_base
block 2 - 4.3.5-1           # pkg_version_build
block 3 - 4.3.5             # pkg_version
block 4 - 1                 # pkg_build
block 5 - x86_64            # pkg_arch

使用下面的正则表达式,我得到块 1 和块 5,如上所示。

str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"
pkg_re='(.+)-[^-]+-[0-9]+-([^.]+)\.chi.zst*'

[[ $str =~ $pkg_re ]] &&
    pkg_base = ${BASH_REMATCH[1]}
    pkg_arch = ${BASH_REMATCH[2]}

在以下情况下,表达式还必须被视为文件名字符串:

str="python-4.3.5-1-x86_64.chi.zst"
str="python-zope-4.3.5-1-x86_64.chi.zst"
str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"

【问题讨论】:

  • 如果您只想匹配单个 t (.+)-(([^-]+)-([0-9]+))-([^.]+)\.chi\.zst regex101.com/r/CSeGSk/1,我认为您可以添加一些额外的捕获组,转义最后一个点并删除最后一个 t 之后的星号
  • @Thefourthbird 完美!
  • @Thefourthbird 在某些情况下正则表达式不起作用,我应该在哪里发布并解释什么不起作用?
  • 您可以在答案下添加评论,对于哪种情况它不起作用。

标签: regex bash shell


【解决方案1】:

您可以添加嵌套的捕获组来获取值。请注意转义最后一个点并删除 t* 之后的星号,因为它将匹配 0+ 次 t

(.+)-(([^-]+)-([0-9]+))-([^.]+)\.chi\.zst

查看regex demobash demo

【讨论】:

    【解决方案2】:

    更倾向于 K.I.S.S.原理...基于参数扩展的解决方案:

    str="python-zope-proxy-4.3.5-1-x86_64.chi.zst"
    
    block1="${str//-[0-9].*/}"
    
    block2="${str//${block1}-/}"
    block2="${block2%-*}"
    
    block3="${block2%%-*}"
    
    block4="${block2#*-}"
    
    block5="${str//${block1}-${block2}-/}"
    block5="${block5%%.*}"
    
    echo "block1:${block1}:"
    echo "block2:${block2}:"
    echo "block3:${block3}:"
    echo "block4:${block4}:"
    echo "block5:${block5}:"
    

    这会生成:

    block1:python-zope-proxy:
    block2:4.3.5-1:
    block3:4.3.5:
    block4:1:
    block5:x86_64:
    

    针对三个样本运行:

    for str in "python-4.3.5-1-x86_64.chi.zst" "python-zope-4.3.5-1-x86_64.chi.zst" "python-zope-proxy-4.3.5-1-x86_64.chi.zst"
    do
        echo "+++++++++++ ${str}"
        ... block1-block5 processing (copy from above) ...
    done
    

    这会产生:

    +++++++++++ python-4.3.5-1-x86_64.chi.zst
    block1:python:
    block2:4.3.5-1:
    block3:4.3.5:
    block4:1:
    block5:x86_64:
    +++++++++++ python-zope-4.3.5-1-x86_64.chi.zst
    block1:python-zope:
    block2:4.3.5-1:
    block3:4.3.5:
    block4:1:
    block5:x86_64:
    +++++++++++ python-zope-proxy-4.3.5-1-x86_64.chi.zst
    block1:python-zope-proxy:
    block2:4.3.5-1:
    block3:4.3.5:
    block4:1:
    block5:x86_64:
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-19
      • 2011-06-18
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多