首页 > 解决方案 > bash:从文本字符串中解析一个数字

问题描述

我正在编写一个扫描文本行列表的小 bash 脚本,每个文本行的格式如下:

num1 num2 num3 文件名

对于每一行,我只想解析出第一个数字标记。这是我的代码:

printf "input line: %s\n" "${line}"
let number="${line//^[0-9]+/}"
printf "regexp parsed %s\n" "${number}"

好吧,它确实解析出了该行中的第一个数字,但也输出了一条错误消息:

input line: 11531          1008      16   12555    310b /usr/bin/gresource
./statistics.sh: line 21: let: number=11531           1008      16   12555    310b /usr/bin/gresource: syntax error in expression (error token is "1008          16   12555    310b /usr/bin/gresource")
regexp parsed 11531

为什么我会收到此错误消息?如何$[0-9]+$line不出现错误的情况下应用正则表达式?

标签: regexbash

解决方案


参数扩展需要模式,而不是正则表达式。此外,您的尝试将删除该数字而不是捕获它。真正发生的是let通过注释但忽略行的非数字部分将整行转换为数字。(也就是说,它只“有效”,因为该行实际上以数字开头。)

考虑以下,使用与正则表达式等效的扩展[0-9]+模式。请注意,您的正则表达式被视为模式,不匹配任何内容。

$ echo "$line"
11531          1008      16   12555    310b /usr/bin/gresource
$ echo "${line//^[0-9]+/}"
11531          1008      16   12555    310b /usr/bin/gresource
$ shopt -s extglob
$ echo "${line/+([0-9])}"
          1008      16   12555    310b /usr/bin/gresource

使用正则表达式匹配。

[[ $line =~ [0-9]+ ]] && number=${BASH_REMATCH[0]}

推荐阅读