Regex 使用正则表达式将科学形式的浮点数与grep匹配
我一直在使用正则表达式将浮点数的科学表示法与grep进行匹配。我的问题如下: 我想在一个文件中获取所有浮点数(用科学符号表示),但该文件中还有其他字符串。 文件内容如下所示:Regex 使用正则表达式将科学形式的浮点数与grep匹配,regex,bash,shell,awk,grep,Regex,Bash,Shell,Awk,Grep,我一直在使用正则表达式将浮点数的科学表示法与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.1
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
它确实可以过滤掉科学记数法中的所有数字。但是像“再出口”和“远程外壳”这样的词也被过滤掉了。这对我来说很奇怪。然后我删除了\?限定符:
grep "[0-9]*\.[0-9]*[eE][+-][0-9]*" filename
这一次,诸如re-export和remote shell之类的词不包括在内。但我真的很困惑,因为\?限定符只表示前面的项。(点)是可选的,为什么它使它之前的所有内容都是可选的?有人能解释为什么会发生这种情况,并提供一个解决方案,只需在\之前制作单个项目吗?限定符是可选的,稍后我还需要过滤掉像2e-3这样的数字
关于为什么会发生这种情况的答案很简单:正则表达式中唯一必须的子模式是[eE][+-]
,因此它将匹配e-
,e+
,e-
,e+
中的任何一个
您需要强制执行数字部分。这取决于您需要支持哪种数字格式,但在大多数情况下,您可以使用+
量词来匹配一个或多个匹配项:
"[0-9]*\.\?[0-9]\+[eE][+-][0-9]*"
^^
也许
之前的第一个[0-9]
应该是强制性的too@slezica:这个正则表达式有很多变体,我只想指出正确的方向。也许会更好。只有[0-9]
必须至少匹配一个数字。当然,我只是指出,对于未来的读者来说,这是一个非常好的答案:)向上投票是我的我注意到你不接受答案(只接受第一个)。注意:接受答案将获得+2代表分。请这样做。如果有任何答案对你有用(请参阅),请考虑接受所有为你工作的问题的答案(参见)和投票。您的问题是显示给定输入的预期输出,因为不清楚您是希望每个fp编号位于自己的输出行上,还是希望每行至少包含一个fp编号或其他内容。wrt稍后,我还需要过滤掉像2e-3这样的数字-只需在问题中包含您需要处理的任何输入,因为您几乎肯定不需要多次传递输入数据,我们需要看到真正具有代表性的输入,以便能够最好地帮助您。