不要介意奇怪的编码。
有没有办法(在这样的表中,以OF DAMAGE STABILITY开头)并以“Flooding percentage”行结束,以匹配最后一列中小于某个值的数字(例如,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.
答案 0 :(得分: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完成。如果你是微软的人,Excel可能(我不确定)是一个好工具。
修改强>
从你的评论中,我认为你没有得到我的意思。我
命令:
/STABILITY/,/Flooding/s/\v([0-9.-]+\d)\s*$/\=str2float(submatch(1))<0.040? submatch(1).'<':submatch(1)/
然后你搜索:
/[0-9.-]\+\d\ze<$
注意这突出了数字(我仍然使用0.040
来查看差异),还添加了标记/后缀<
。您可以按n
移至下一个突出显示的数字。之前的N
。如果您完成“阅读”文件,请退出:q!
或ZQ
以跳过更改。
我希望这符合您的要求。
看到这个例子:
答案 1 :(得分:2)
提出一个在浮点数上断言某个数字范围的正则表达式确实非常复杂。
如果您坚持使用Vim(请记住,它是文本编辑器,而过滤基于结构化列的信息更适合电子表格),您可以使用一个相当宽松的正则表达式,匹配所有数字“候选人”,并在替换表达式中执行确切的数字范围断言。您无法使用正常/
搜索,您必须使用:substitute
(例如,使用无操作替换或处理您想要实现的任何内容)来使用:help sub-replace-expression
:
:%substitute/[+-]\?\d\+\.\d\+$/\=str2float(submatch(0)) < 0.018 ? 'match' : submatch(0)/
答案 2 :(得分:0)
您可以执行以下操作:
/0.0\(2[0-1]\|[0-1][0-9]\)$
$
是行锚的结束。分组的第一部分匹配20和21,因此0.021是匹配的最大数字。 \|
之后的交替匹配从00到19的所有内容。因此,此正则表达式匹配行上的最后一个数字,该数字介于0.021和0.000之间。
正如您所看到的,比较数字对于正则表达式有点烦人,因为您需要将数字视为字符串,并使用ASCII顺序。