繁体   English   中英

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

[英]Is it possible to find the largest number in a file using Vim regex?

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

warning-some txt
path_to_file, <line_number>
method name

该文件可能有 10,000 多行,所有行都遵循与上述相同的格式。

如何使用 Vim 正则表达式找到最大的<line_number> (知道我可以确定需要分配多大的数组。)

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

:sort!n/^path/

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

如果要过滤行的路径包含斜杠,使用/以外的字符来分隔模式会很方便(请参阅:help E146 )。 例如,

:sort!n#^path#

此外,当路径名过滤是多余的时,甚至更简单的命令也可以完成这项工作,

:sort!n

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

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

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

通过选择一个区域并使用! vim命令,你可以通过命令管道你的缓冲区来达到vim的效果。

我假设您正在尝试获取文件中最大的<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 ..

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

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

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

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

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

它初始化 max (我希望在你的文件中没有专门的负行号),然后对所有匹配的行执行宏 thanx 到 g 命令。

HTH

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM