regex - 命令行 grep 正则表达式数小于 100,包括浮点数。(BRE)
问题描述
我正在尝试创建一个 grep 正则表达式模式,该模式允许我从以下 csv 文件的 mass(g) 列中获取所有低于 100 的值(包括浮点数)。
我需要使用 grep,最好是 BRE(基本正则表达式模式),我不能使用 cut 来指定我感兴趣的列。
我现在拥有的是:
,\d{2},|,\d{2}.\d*,
此命令在我的 Ubuntu 命令行中不起作用(尽管当我在https://regex101.com/中检查它时它似乎是正确的
谁能用 BRE 模式帮助我解决这个问题?
名称、id、名称类型、recclass、质量 (g)、fall、year、reclat、reclong、GeoLocation
Aachen,1,Valid,L5,21,Fell,01/01/1880 12:00:00 AM,50.775000,6.083330,"(50.775; 6.08333)"
Aarhus,2,Valid,H6,720,Fell,01/01/1951 12:00:00 AM,56.183330,10.233330,"(56.18333; 10.23333)"
Abee,6,Valid,EH4,107000,Fell,01/01/1952 12:00:00 AM,54.216670,-113.000000,"(54.21667; -113.0)"
Acapulco,10,Valid,Acapulcoite,1914,Fell,01/01/1976 12:00:00 AM,16.883330,-99.900000,"(16.88333; -99.9)"
解决方案
您实际上可以将 Bash 与 POSIX ERE 正则表达式一起使用,例如
rx=',([0-9]{1,2}(\.[0-9]{1,3})?),'
while IFS= read -a line; do
if [[ "$line" =~ $rx ]]; then
echo "${BASH_REMATCH[1]}";
fi
done < file
请参阅此演示。正,([0-9]{1,2}(\.[0-9]{1,3})?),
则表达式匹配
,
- 一个逗号([0-9]{1,2}(\.[0-9]{1,3})?)
- 第 1 组:[0-9]{1,2}
- 一位或两位数(\.[0-9]{1,3})?
- 可选的第 2 组:一个点、一个、两个或三个数字
,
- 一个逗号
${BASH_REMATCH[1]}
仅获取 Group 1 值。
如果您非常需要 POSIX BRE 解决方案grep
,您可以使用
while IFS= read -a line; do
m=$(grep -o ',[0-9]\{1,2\}\(\.[0-9]\{1,3\}\)\{0,1\},' <<< "$line" | head -n 1)
echo "${m//,/}"
done < file
请参阅在线演示。正则表达式与仅具有一个捕获组的 POSIX ERE 相同,用于量化.
1-3 小数位数。| head -n 1
用于提取一行中的第一个匹配项。
但是,grep
不建议在迭代文件中的行时使用。
推荐阅读
- javascript - Vue Test Utils - 触发点击事件后数据不更新
- javascript - 更改打印 CSS 表格的列宽
- php - PHP Laravel 从数据库中获取唯一/不同的字符串
- nginx - Nginx代理1935到子目录路径?
- environment-variables - GCE:从元数据设置环境变量
- flutter - 展开或灵活添加白底
- javascript - 使用 Math.js 计算矩阵运算的近似值
- actions-on-google - 使用带有 scene.slots.params 和其他参数的 Prompts
- python - 如何使用第二个词典列表更新词典列表?
- html - 创建没有任何 id 或类的 jquery 选项卡