Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex bash:从文本字符串中解析数字_Regex_Bash - Fatal编程技术网

Regex bash:从文本字符串中解析数字

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

我正在编写一个小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

为什么我会收到此错误消息?如何在
$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