【问题标题】:Parsing file name in Bash在 Bash 中解析文件名
【发布时间】:2016-06-15 22:59:55
【问题描述】:

我目前正在编写脚本,但在获取正确的子字符串值时遇到问题。

文件名为 Package-amd64-3.0.11.deb。我需要从这个名称中提取“3.0.11”,但是当我使用子字符串时,我不知道如何正确预测字符数(如果我有一个版本号为 3.0.9 的文件会中断)

fName="/etc/deb/Package-amd64-3.0.11.deb"
version="${fName:23:29}"

【问题讨论】:

  • [[ "/etc/deb/Package-amd64-3.0.11.deb" =~ [0-9]+\.[0-9]+\.[0-9]+ ]] && echo "${BASH_REMATCH[0]}",或类似的东西。

标签: linux string bash sed grep


【解决方案1】:

两步。首先,剥离所有内容,包括最后的-

version=${fName##*-}

接下来,去掉扩展:

version=${version%.deb}

这应该对包名称的更改具有相当的弹性,并且可以在必要时轻松修改。

【讨论】:

    【解决方案2】:

    删除已知的后缀和前缀可能是最简单的:

    fName="/etc/deb/Package-amd64-3.0.11.deb"
    version="${fName%.deb}"
    version="${version##*-}"
    

    【讨论】:

      【解决方案3】:

      使用sed

      fName="/etc/deb/Package-amd64-3.0.11.deb"
      sed -E 's/.*-(.+)\.[^.]*$/\1/' <<< "$fName"
      
      3.0.11
      

      使用 awk 你可以做到:

      awk -F- '{sub(/\.[^.]*$/, ""); print $NF}' <<< "$fName"
      
      3.0.11
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2012-09-13
        • 2018-08-30
        • 1970-01-01
        • 2011-05-16
        • 2013-08-30
        • 2014-04-28
        相关资源
        最近更新 更多