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 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
不出现错误的情况下应用正则表达式?
解决方案
参数扩展需要模式,而不是正则表达式。此外,您的尝试将删除该数字而不是捕获它。真正发生的是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]}
推荐阅读
- java - Java do-while 循环看不到结束语句
- python-3.x - 节点JS | 蟒蛇 | Heroku - 在表单发布后 48 小时安排电子邮件
- python - 创建一个 'int' 的子类,但仍返回 'int' 类型
- php - 解析错误:语法错误、意外的 '' (T_ENCAPSED_AND_WHITESPACE)、需要 '-' 或标识符 (T_STRING) 或变量 (T_VARIABLE)
- tensorflow - MemoryError:无法为形状(275703、5863139)和数据类型 float32 的数组分配 5.88 TiB
- statistics - Julia 的中值绝对偏差
- c# - WPF:根据条件将不同的枚举填充到我的 ComBoBox 中
- google-sheets - 如何使用 VLOOKUP 返回重复的查找值?
- reactjs - 如何加载 .xlsx 文件并显示其数据?
- apache-spark - 如何处理(Apache Beam)高 IO 瓶颈?