首页 > 解决方案 > 命令行 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)"

标签: regexcommand-linegrep

解决方案


您实际上可以将 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不建议在迭代文件中的行时使用。


推荐阅读