Regex bash:从文本字符串中解析数字
我正在编写一个小bash脚本,它扫描一系列文本行,每一行的格式如下: num1 num2 num3文件名 对于每一行,我只想解析出第一个数字标记。这是我的代码:Regex bash:从文本字符串中解析数字,regex,bash,Regex,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
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
为什么我会收到此错误消息?如何在
$line
上应用regexp$[0-9]+
而不出错?参数扩展需要的是模式,而不是正则表达式。此外,您的尝试将删除该号码,而不是捕获该号码。真正发生的是,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]}
如果行都是这种格式,请使用
cut
,因为不需要解析数字:
cut -d ' ' -f 1 <<< 'num1 num2 num3 filename'
对于输入文件,请执行以下操作:
cut -d ' ' -f 1 inputfile.txt
为什么您需要
让?您没有执行任何算术运算。请显示所需输出的示例。我认为您可以使用sed
,sed-r/[^0-9]*([0-9]+)./\1/'
@agc,所需的输出是:input line:11531 1008 16 12555 310b/usr/bin/gresource regexp parsed 11531如果您试图通过bash内置程序提取行的第一个字,您的方法是${line%%[!0-9]*}
,,它从$line
中删除所有尾随字符,从第一个非数字开始,即只保留前导字符,即数字。好的,谢谢。你可能已经猜到了,我对bash完全是个傻瓜。您在回答中提到了“参数扩展”。这是${something}类型的表达式吗?好的,至于“参数表达式”,我得到了这个人:
cut -d ' ' -f 1 inputfile.txt