【问题标题】: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。
【问题讨论】:
标签:
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%% *}
这假定错误计数前面是-,后面是一个空格,后面是一个空格。