【问题标题】:bash scripting - removing trailing chars from the end of a stringbash 脚本 - 从字符串末尾删除尾随字符
【发布时间】:2015-09-30 18:59:01
【问题描述】:

我有一个这样的字符串:

rthbp-0.0.3-sources.jar

我想以某种方式调用一个新字符串(如 string2),原始字符串只有版本,所以 - '0.0.3' 现在 rthbp- 在开始时将保持不变,但在版本“-”之后( -sources.jar) 可能会改变。

这在 bash 中是否可能,只是为了提取版本信息?

我正在这样做 - echo ${f:6} 但只给了我 0.0.3-sources.jar

【问题讨论】:

    标签: bash shell unix sh bash-completion


    【解决方案1】:

    如果您使用的是 bash,则可以通过指定偏移量和长度来提取任意子字符串:

    $ filename=rthbp-0.0.3-sources.jar
    $ echo "${filename:6:5}"
    #=> 0.0.3
    

    但是像这样使用精确的字符偏移是脆弱的。你可能想使用这样的东西:

    $ IFS=- read pre version post <<<"$filename"
    $ echo "$version"
    #=> 0.0.3
    

    或者,更笨拙一些:

    $ ltrim=${filename%%-*}-
    $ rest=${filename#$ltrim}
    $ version=${rest%%-*}
    

    或者正如其他人提到的,您可以致电cutawk 为您进行拆分..

    【讨论】:

    • 笨重的代码可以简化一点:version_and_suffix=${filename#rthbp-}; version=${version_and_suffix%%-*}
    • 我试图不假设我们完全知道文件名的第一部分,但可以肯定。
    【解决方案2】:

    还没有人提到正则表达式匹配,所以我会。

    [[ $string1 =~ rthbp-(.*)-sources.jar ]]
    version=${BASH_REMATCH[1]}
    

    (您可能需要更通用的正则表达式;这只是演示如何匹配包含捕获组的正则表达式以及如何提取捕获的值。)

    【讨论】:

      【解决方案3】:

      你可以使用read内置:

      s='rthbp-0.0.3-sources.jar'
      IFS=- read a ver _ <<< "$s" && echo "$ver"
      0.0.3
      

      【讨论】:

        【解决方案4】:

        我建议只使用cut。将分隔符定义为破折号并保留字段二:

        $ echo "rthbp-0.0.3-sources.jar" | cut -d'-' -f 2
        0.0.3
        

        如果你想使用纯 bash,你可以使用parameter expansion,但它不是那么干净。假设版本总是在同一个地方开始并且是相同的长度,你可以使用:

        $ str="rthbp-0.0.3-sources.jar"
        
        $ echo "${str:6:5}"
        0.0.3
        

        【讨论】:

          【解决方案5】:

          正则表达式匹配的另一种变体:

          $ echo "rthbp-0.0.3-sources.jar"|grep -e '([[:digit:]]+\.)+[[:digit:]]+' -oP
          0.0.3
          

          【讨论】:

            【解决方案6】:
            echo "rthbp-0.0.3-sources.jar" | awk -F- '$2=="0.0.3"{print $2}'
            0.0.3
            
            
            echo "rthbp-0.0.3-sources.jar" | awk -F- '{print $2}'
            0.0.3
            

            【讨论】:

              猜你喜欢
              • 2011-03-07
              • 2023-04-07
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多