【问题标题】:How to extract part of string in bash? [duplicate]如何在bash中提取部分字符串? [复制]
【发布时间】:2016-05-18 20:49:37
【问题描述】:

如何在 bash 中提取部分字符串?假设我有一个字符串product_name_v1.2。此名称不是固定的,因为它可以更改。不过可以确定的是,字符串中会有一个版本号,格式类似于v#.#

我想做的是从字符串中提取v1.21.2。有什么建议吗?

【问题讨论】:

    标签: bash shell sh


    【解决方案1】:

    假设你想从字符串中提取数字和点:

    input="product_name_v1.2_more_stuff_here"
    echo "${input//[^0-9.]/}"
    1.2
    

    【讨论】:

      【解决方案2】:
      var=product_name_v1.2
      #from the beginning strip (#) longest (##) glob ending in v (*v)
      echo "${var##*v}
      

      Bash 也有正则表达式匹配([[=~),但 basic string manipulation 应该足以满足您的用例。

      (您也可以查看bash(1)了解更多信息)。

      【讨论】:

        【解决方案3】:

        在任何 POSIX shell 中,这都很简单:

        str=product_name_v1.2
        version=${str##*_v}
        echo $version
        #=> 1.2
        

        ${name##pattern} 的构造删除了参数 $name 的内容中与 glob 匹配的最长前缀 pattern,只留下后面的内容。

        【讨论】:

        【解决方案4】:

        您可以使用多种标准工具,例如:

        • expr product_name_v1.2 : 'product_name_\(.*\)'
        • expr product_name_v1.2 : '.*_\(v.*\)'
        • echo product_name_v1.2 | sed -ne's/^.*_\(v[0-9.]\+\)$/\1/p'

        选择主要取决于匹配的复杂程度。 expr 仅支持有限的锚定正则表达式匹配,在上面的示例中就足够了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-09-07
          • 2013-07-30
          • 2020-09-28
          • 2018-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多