2

不要介意奇怪的编码。

有没有办法(在这样的表中,以 OF DAMAGE STABILITY 开头)并以“Flooding percent”行结束,仅匹配最后一列中小于某个值(例如 0.018)的数字?

我正在练习正则表达式,但这对我现阶段来说太过分了。所以我希望有人至少可以推荐什么是最好的方法。

                    SUMMARY OF RESULTS OF DAMAGE STABILITY                      
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
       DAMAGE CASE               %  R  HEEL   GM     FBmin   GZ>0  GZmax  Area  
                                      (deg)   (m)     (m)   (deg)   (m)  (m.rad)
 ÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
 109.10s                        100 1  -4.1   0.438   1.243  59.2  0.133  0.021 
                                 20 1  -6.6   0.740   2.215  63.4  0.479  0.049 
                                 40 1  -5.8   0.721   2.372  64.2  0.393  0.045 
                                 60 1  -3.2   0.728   2.537  66.8  0.277  0.041 
                                 80 1  -0.8   0.721   2.354  66.8  0.192  0.037 

 109.10p                        100 1  -4.1   0.438   1.243  59.2  0.133  0.021 
                                 20 1   4.5   0.688   2.494  65.5  0.507  0.049 
                                 40 1   3.7   0.684   2.580  66.3  0.417  0.046 
                                 60 1   1.1   0.720   2.599  68.9  0.300  0.043 
                                 80 1  -1.2   0.693   2.350  65.2  0.177  0.035 


 110.10s                        100 1  -3.0   0.748   1.837  39.7  0.494  0.049 
                                 20 1  -2.9   0.777   2.333  43.1  0.594  0.052 
                                 40 1  -2.9   0.777   2.333  42.5  0.576  0.052 
                                 60 1  -2.9   0.756   2.294  41.6  0.551  0.050 
                                 80 1  -2.9   0.748   2.077  40.7  0.520  0.049 

 110.10p                        100 1  -0.5   0.733   2.143  41.6  0.484  0.047 
                                 20 1  -0.5   0.763   2.627  45.3  0.613  0.051 
                                 40 1  -0.5   0.763   2.627  44.7  0.592  0.051 
                                 60 1  -0.5   0.740   2.593  43.8  0.558  0.049 
                                 80 1  -0.5   0.767   2.372  42.7  0.516  0.048 


 %     : Flooding percentage.                                                   
 R     : R=1 if run-off weights considered, R=0 if no run-off.                  
 HEEL  : Heel at equilibrium (negative if equilibrium is on port).              
 GM    : GM at equilibrium.                                                     
 FBmin : Minimum distance of margin line, weathertight or non-weathertight      
         points from waterline.                                                 
 GZ>0  : Range of positive GZ limited to immersion of non-weathertight openings.
 GZmax : Maximum GZ value.                              
4

3 回答 3

4

这个0.018例子不好,因为你最后一列中的所有数字都大于0.018......我花了几分钟才找到它。我以为我的 vim 替换命令有问题...

查看示例,给定的范围边界(以 OF DAMAGE STABILITY 开头并以“Flooding percentage”结尾)不是必需的,但您最了解需求。我也在命令中添加了范围。

在下面的命令中,我将其更改为0.040以便我们可以看到差异。以下命令将*在匹配号码的末尾添加一个。

 /STABILITY/,/Flooding/s/\v([0-9.-]+)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'*':submatch(1)

简短说明:

 /STABILITY/,/Flooding/                                      " fit the range, as you defined
 s/                                                          " start substitution
 \v                                                          " use very magic, so that I could save some escaping
 ([0-9.-]+)\s*$/                                             " match the last number column (float or negative)
 \=str2float(submatch(1))<0.040? submatch(1).'*':submatch(1) " vimscript expression, if the value<0.040, add a '*'

如果你在 linux 机器上,这个工作也很容易由 awk 完成。如果您是 Microsoft 人员,Excel 可能(我不确定)是个好工具。

编辑

从你的评论中,我想你没有明白我的意思。我

命令:

 /STABILITY/,/Flooding/s/\v([0-9.-]+\d)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'<':submatch(1)/

然后你搜索:

/[0-9.-]\+\d\ze<$

请注意,这突出显示了数字(我仍然0.040用来查看差异),还添加了 flag/suffix <。您可以按 移动到下一个突出显示的数字n。以前N的 . 如果您完成“读取”文件,请退出:q!ZQ跳过更改。

我希望这能满足你的要求。

看这个例子: 在此处输入图像描述

于 2013-05-15T08:59:33.807 回答
2

提出一个在浮点数上断言某个数字范围的正则表达式确实非常复杂。

如果您坚持使用 Vim(请记住,它是一个文本编辑器,而对基于列的结构化信息进行过滤更适合电子表格),您可以使用一个相当宽松的正则表达式来匹配所有数字“候选人”,并准确替换表达式中的数字范围断言。您不能使用普通/搜索,您必须使用:substitute(例如,使用无操作替换,或处理您想要实现的任何内容)来使用:help sub-replace-expression

:%substitute/[+-]\?\d\+\.\d\+$/\=str2float(submatch(0)) < 0.018 ? 'match' : submatch(0)/
于 2013-05-15T08:45:37.693 回答
0

您可以执行以下操作:

/0.0\(2[0-1]\|[0-1][0-9]\)$

$是线锚的末端。分组的第一部分匹配 20 和 21,因此 0.021 是匹配的最大数字。之后的交替\|匹配从 00 到 19 的所有内容。所以这个正则表达式匹配行上的最后一个数字,它在 0.021 和 0.000 之间。

如您所见,使用正则表达式比较数字有点烦人,因为您需要将数字视为字符串,并使用 ASCII 顺序。

于 2013-05-15T08:45:24.680 回答