【问题标题】:Bash: extract 2nd integer from test stringBash:从测试字符串中提取第二个整数
【发布时间】:2020-04-21 02:17:46
【问题描述】:

我有一个可以包含 2 个或更多整数的字符串。我正在尝试仅提取第二个整数,但以下代码正在打印所有出现。

#!/bin/bash

TEST_STRING=$(echo "207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff")

ERROR_COUNT=$(echo $TEST_STRING | grep -o -E '[0-9]+')

echo $ERROR_COUNT

输出是:

207 11 0 0

基本上,对于给定的 TEST_STRING,我希望 ERROR_COUNT 为 11。

【问题讨论】:

  • 试试'[0-9]{2}'

标签: regex bash shell grep


【解决方案1】:

使用 bash 的 =~ 运算符:

$ test_string="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
$ [[ $test_string =~ [0-9]+[^0-9]+([0-9]+) ]] && [[ ! -z ${BASH_REMATCH[1]} ]] && echo ${BASH_REMATCH[1]}
11

解释:

  • [[ $test_string =~ [0-9]+[^0-9]+([0-9]+) ]] 如果$test_string 有子字符串
    integer — non-integer — integer,则后一个整数设置为变量${BASH_REMATCH[1]}
  • &&
  • [[ ! -z ${BASH_REMATCH[1]} ]] 变量实际上设置了一些东西
  • &&“那么”
  • echo ${BASH_REMATCH[1]}输出变量

【讨论】:

    【解决方案2】:
    #!/bin/bash
    
    TEST_STRING=$(echo "207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff")
    
    ERROR_COUNT="$( echo "${TEST_STRING}" | awk '{print $3}' )"
    
    echo "${ERROR_COUNT}"
    

    输出是:

    11
    

    【讨论】:

      【解决方案3】:

      这是我的看法,使用read 来解析单独的变量:

      TEST_STRING="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
      read num sep ERROR_COUNT rest <<<"$TEST_STRING"
      echo ${ERROR_COUNT}
      11
      

      【讨论】:

        【解决方案4】:

        使用辅助变量:

        TEST_STRING="207 - 11 (INTERRUPT_NAME) 0xffffffff:0xffffffff"
        # Remove everything until the space in front of the 11
        temp=${TEST_STRING#*- }
        # Remove what comes afterwards
        ERROR_COUNT=${temp%% *}
        

        这假定错误计数前面是-,后面是一个空格,后面是一个空格。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-23
          • 1970-01-01
          • 2020-07-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-09
          相关资源
          最近更新 更多