bash:解析文本字符串中的数字

时间:2018-05-18 11:58:33

标签: regex bash

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

  

num1 num2 num3 filename

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

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而不会收到错误?

2 个答案:

答案 0 :(得分:1)

参数扩展需要模式,而不是正则表达式。此外,您的尝试将删除数字而不是捕获它。真正发生的是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]}

答案 1 :(得分:0)

如果这些行都是这种格式,请使用cut,因为不需要解析数字:

cut -d ' ' -f 1 <<< 'num1 num2 num3 filename'

输出:

num1

输入文件:

cut -d ' ' -f 1  inputfile.txt