【问题标题】:Command line grep regex number lower than 100 including floating points. (BRE)命令行 grep 正则表达式数小于 100,包括浮点数。 (BRE)
【发布时间】:2021-04-27 20:03:26
【问题描述】:

我正在尝试创建一个 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)"

【问题讨论】:

  • 试试grep -o ',[0-9]\{2\}\(\.[0-9]*\)\{0,1\},' filegrep -oE '\<[0-9]{2}(\.[0-9]+)?\>' file
  • 为什么你只能使用grep来解析CSV?您的预期输出是什么?
  • ideone.com/6H9riY 会为你工作吗?
  • 嘿维克托!非常感谢您的回答!所以我想我需要用 grep 来学习它的语法(并在过程中丢失一些)所以你的正则表达式有效,但不幸的是它也匹配 lat 和 long 列。 @WiktorStribiżew
  • 与此同时,我提出了这种正确定义数字范围的模式 grep "\,[[:digit:]]\{1,2\}\,\|\,[ [:digit:]]\{1,2\}\.[[:digit:]]\+\," datosMeteoritos.csv 但它也匹配我不感兴趣的列。关于如何解决这个问题的任何想法?

标签: regex command-line grep


【解决方案1】:

您实际上可以将 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

this demo,([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]} 仅获取第 1 组的值。

如果您非常需要 grep 的 POSIX BRE 解决方案,您可以使用

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

请参阅online demo。正则表达式与仅具有一个捕获组的 POSIX ERE 相同,用于量化 . 和 1-3 个小数位。 | head -n 1 用于提取一行中的第一个匹配项。

但是,不建议在迭代文件中的行时使用grep

【讨论】:

  • 如果你的 grep 只能做 POSIX BRE(即没有-E),它会有-o吗?
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2012-09-20
  • 2016-09-21
相关资源
最近更新 更多