是否可以使用VIM的正则表达式在文件中找到最大数字?

时间:2012-01-04 16:48:23

标签: regex vim

我有一个格式如下的文件:

warning-some txt
path_to_file, <line_number>
method name

该文件可能包含&gt; 10k行,但遵循相同的格式。我如何使用VIM的正则表达式找到最大的,这样我知道我需要分配什么样的数组大小。

谢谢

4 个答案:

答案 0 :(得分:1)

您无法使用正则表达式来确定最大数量。它们根本不够强大(因为正则表达式只有有限的内存)。你能做的就是简单的外壳魔术:

grep '^path_to_file' | sed -e 's/^path_to_file, /' | sort -n | tail -n 1

通过选择区域并在!中使用vim命令,您可以通过命令管道缓冲区以在vim中实现效果。

答案 1 :(得分:1)

有一种优雅的方法可以通过找到该文件中的最大数字 只有Vim。命令

:sort!n/^path/

将文件中以path开头的所有行移到当前第一行以上 line,并从最大的行中按行中的第一个十进制数对它们进行排序 数字到最小的。

如果您希望过滤行的路径包含斜杠,则为 方便使用/以外的字符来分隔图案(参见 :help E146)。例如,

:sort!n#^path#

此外,当通过路径名过滤是多余的时,甚至更简单的命令也可能 做好这份工作,

:sort!n

只需按行中出现的第一个数字对行进行排序。

答案 2 :(得分:0)

我假设您正在尝试获取文件中最大的<line number>

如果我们在vim中需要外部命令,为什么不在shell中呢?例如awk one-liner给你最大的:

 awk -F, 'NF>1{max=($2+0)>max?$2:max} END{print max}' file

试验:

kent$  cat v
warning-some txt
path_to_file, 234
method name
warning-some txt
path_to_file, 888
method name
warning-some txt
path_to_file, 2
method name
warning-some txt
path_to_file, 123
method name

kent$  awk -F, 'NF>1{max=($2+0)>max?$2:max} END{print max}' v
 888

如果你愿意,你当然可以在vim中调用awk ..

答案 3 :(得分:0)

宏可以完成大部分工作,我们可以使用秒来自动完成整个任务,让我们来吧 准备一个宏来更新/ path_to_file,/ line上的最大行号,比如注册@l。

ql$by$:let m=max([m,@"])<CR>q

到达行尾,备份到数字的开头,将其拉入 默认寄存器(@“即”)然后相应地更新m。

现在我将这个包装成以下命令,您可能希望将其包装到另一个命令中 宏用于重用

:let m=0
:g/path_to_file/exe "normal @l"

初始化最大值(我希望文件中没有专门的负数行号) 然后为g命令执行所有匹配行的宏。

HTH