【问题标题】:How to extract a number out of a string preceded by zeroes如何从前面为零的字符串中提取数字
【发布时间】:2019-03-05 10:41:36
【问题描述】:

我得到了一个看起来像这样的字符串SOMETHING00000076XYZ

如何使用 shell 脚本 从字符串中提取数字 76注意76前面是零,后面是字母。

【问题讨论】:

    标签: regex shell awk sed


    【解决方案1】:

    第一个解决方案:如果您对 awk 没问题,请尝试关注。

    echo "SOMETHING00000076XYZ" | awk 'match($0,/0+[0-9]+/){val=substr($0,RSTART,RLENGTH);sub(/0+/,"",val);print val;val=""}'
    

    如果您想将其保存到变量中,请使用以下内容。

    variable="$(echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1')"
    

    第二个解决方案:在此处再添加 1 个awk 解决方案(记住您的示例)。

    echo "SOMETHING00000076XYZ" | awk '{sub(/.*[^1-9]0+/,"");sub(/[a-zA-Z]+/,"")} 1'
    

    【讨论】:

      【解决方案2】:

      这是一个sed 选项:

      echo "SOMETHING00000076XYZ" | sed -r 's/[^0-9]*0*([0-9]+).*/\1/g';
      
      76
      

      这里是使用的正则表达式模式的解释:

      [^0-9]*   match zero or more non digits
      0*        match zero or more 0's
      ([0-9]+)  match AND capture any quantity of non zero digits
      .*        match the remainder of the string
      

      然后,我们只需替换为\1,这是第一个(也是唯一一个)捕获组。

      【讨论】:

        【解决方案3】:
        echo 'SOMETHING00000076XYZ' | grep -o '[1-9][0-9]*'
        

        【讨论】:

          【解决方案4】:

          使用gnu grep

          grep -oP '0+\K\d+' <<< 'SOMETHING00000076XYZ'
          

          76
          

          \K 重置所有匹配的信息。


          这是awk的另一个变体:

          awk -F '0+' 'match($2, /^[0-9]+/){print substr($2, 1, RLENGTH)}' <<< 'SOMETHING00000076XYZ'
          

          76
          

          【讨论】:

            【解决方案5】:

            你也可以试试 Perl

            $ echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1  '
            76
            $ a=$(echo "SOMETHING00000076XYZ" | perl -ne ' /\D+0+(\d+)/ and print $1  ')
            
            $ echo $a
            76
            
            $
            

            【讨论】:

              【解决方案6】:
              $ echo 'SOMETHING00000076XYZ' | awk '{sub(/^[^0-9]+/,""); print $0+0}'
              76
              

              【讨论】:

                【解决方案7】:

                你可以使用sed作为

                echo "SOMETHING00000076XYZ" | sed "s/[a-zA-Z]//g" | sed "s/^0*//"

                • 第一步是删除所有字母
                • 第二步是删除前导零

                【讨论】:

                • @EdMorton nice catch Ed,我认为最好改用| sed "s/^0*//"
                猜你喜欢
                • 1970-01-01
                • 2017-07-29
                • 2022-06-21
                • 2011-09-10
                • 1970-01-01
                • 2020-04-02
                • 1970-01-01
                • 2019-06-03
                相关资源
                最近更新 更多