【问题标题】:Matching floating point number in scientific form with grep using regular expression使用正则表达式将科学形式的浮点数与grep匹配
【发布时间】:2017-06-09 18:06:39
【问题描述】:

我坚持使用正则表达式将浮点数的科学记数法与 grep 匹配。我的问题如下:

我想在一个文件中获取所有浮点数(以科学计数法表示),但该文件中还有其他字符串。 文件内容是这样的:

This product is subject to U.S. laws governing export and re-export.
Case run remote-shell.
33080  2.7122e-03  3.7837e-05  4.3489e-05  1.3267e-04  2.7229e-05  4.1196e-05  3.0528e-04  4.7660e-04  5.9506e-06  8.1338e-04  6.6428e-04  1.0230e-04  6.1385e-04  5.3061e-05  4.8918e-04  8.1832e-05  7.5350e-04  6.8355e-04  3.5495e-04  4.3668e-04  1.0076e-04  1.4759e-05  3.3033e-05  3.7662e-05  4.2165e-04  5.1842e-05  3.2158e-04  1.5356e-03  4.2839e-05  2.9283e-04  1.6930e-05  4.9191e-05  3.2135e-05  1.8665e-04  1.6677e-05  3.2952e-04  4.4912e-05  5.6932e-05  1.1145e-03  5.7499e-04  2.1972e-04  3.6925e-05  1.1579e-03  3.9610e-04  3.6176e-04  1.4320e-04  5.9517e-04  2.4946e-04  9.8161e-06  5.3642e-04  5.0760e-03  4.1630e-05  9.5973e-05  5.7817e-05  3.1283e-04  4.4210e-04  9.7502e-06  1.8566e+03  3.0613e-01  0:37:35 1922
33040  3.7547e-03  2.5260e-05  3.0029e-05  9.4277e-05  2.0479e-05  2.4130e-05  1.9597e-04  8.9547e-04  4.2917e-06  5.7030e-04  3.9776e-04  5.8403e-05  3.9431e-04  4.6212e-05  3.2378e-04  4.0916e-05  2.9765e-04  2.7011e-04  2.1954e-04  2.3628e-04  9.6072e-05  1.1480e-05  2.3660e-05  2.4469e-05  2.9498e-04  2.8080e-05  1.9791e-04  1.4410e-03  2.8925e-05  1.8617e-04  1.4366e-05  3.5216e-05  2.9843e-05  1.7923e-04  1.2372e-05  2.0673e-04  3.1176e-05  5.0167e-05  7.0653e-04  3.6454e-04  1.9928e-04  2.2903e-05  8.3425e-04  2.1208e-04  1.7543e-04  9.5440e-05  3.4135e-04  1.7607e-04  7.2080e-06  5.5701e-04  2.9932e-03  3.6117e-05  8.8722e-05  5.1176e-05  2.3192e-04  1.2000e-03  5.9996e-06  1.8570e+03  3.0613e-01  0:38:28 1962

我试过了:

grep "[0-9]*\.\?[0-9]*[eE][+-][0-9]*" filename

它确实可以过滤掉所有科学计数法的数字。但是像 re-exportremote-shell 这样的词也会被过滤掉。这对我来说很奇怪。然后我删除了\?限定词:

grep "[0-9]*\.[0-9]*[eE][+-][0-9]*" filename

这次不包括re-exportremote-shell这样的词。但我真的很困惑作为\? qualifier 只代表前面的 item 。 (dot) 是可选的,为什么它之前的所有内容都是可选的?任何人都可以解释为什么会发生这种情况并提供一个解决方案来在 \ 之前制作单个项目吗?限定符稍后作为可选我还需要过滤掉像这样的数字 2e-3

.

【问题讨论】:

  • edit 你的问题是显示给定输入的预期输出,因为不清楚你是否希望每个 fp 编号在它自己的输出行上,或者每行包含至少一个 fp 编号或其他内容。 wrt later on I also need to filter out numbers like this 2e-3 - 只需在问题中包含您需要处理的任何输入,因为您几乎可以肯定不需要多次传递输入数据,我们需要看到真正有代表性的输入才能最好地帮助您。跨度>

标签: regex bash shell awk grep


【解决方案1】:

为什么的答案很简单:正则表达式中唯一的强制性子模式是[eE][+-],因此它将匹配e-e+E-E+.

您需要使 number 部分成为必填项。这取决于您需要支持哪种数字格式,但在大多数情况下,您可以使用 + 量词来匹配 1 次或多次出现:

"[0-9]*\.\?[0-9]\+[eE][+-][0-9]*"
                ^^

【讨论】:

  • 也许. 之前的第一个[0-9] 也应该是强制性的
  • @slezica:这个正则表达式有很多变体,我只想指出 OP 正确的方向。也许grep -E '([0-9]+\.[0-9]*|\.?[0-9]+)([eE][+-][0-9]+)?' 会更好。只需 [0-9] 必须匹配至少 1 次出现的数字。
  • 当然,我只是为未来的读者指出这一点,这是一个非常好的答案:) 赞成票是我的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-16
  • 2017-02-09
  • 2015-07-02
相关资源
最近更新 更多