我正在编写一个小的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
而不会收到错误?
答案 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