我有一个格式如下的文件:
warning-some txt
path_to_file, <line_number>
method name
该文件可能包含&gt; 10k行,但遵循相同的格式。我如何使用VIM的正则表达式找到最大的,这样我知道我需要分配什么样的数组大小。
谢谢
答案 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