Vim对一个文件进行多重筛选,根据数值设置两个筛选器

Vim对一个文件进行多重筛选,根据数值设置两个筛选器,vim,Vim,我不知道这个标题听起来是否足够 假设我有一个文件(>1000行),整个文件具有均匀的结构,由三个由空格分隔的“字段”组成: 1. an integer (negative or positive) <space> 2. another integer (negative or positive) <space> 3. some text (description) 过滤器可以是:过滤(模仿SQL)StartDate=0且Description包含希腊语的项目

我不知道这个标题听起来是否足够

假设我有一个文件(>1000行),整个文件具有均匀的结构,由三个由空格分隔的“字段”组成:

1. an integer (negative or positive)
   <space>
2. another integer (negative or positive)
   <space>
3. some text (description)

过滤器可以是:过滤(模仿SQL)StartDate=0且Description包含希腊语的项目,结果过滤器=>第2行

以下通用形式将与格式的数字部分匹配:

^\s*-\?\d\+\s\+-\?\d\+
要实现对数字的限制,请使用更具体的模式替换每个
-\?\d\+
。例如,对于
=5或>=3位数字

类似地,对于
=250

-\([5-9][0-9]\|[1-9][0-9]\{2,}\)
\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)
将两者结合起来:

^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)
如果您还需要根据描述中的某些模式进行过滤,请附加以下内容:

^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)\s\+.\{-}Greece
\{-}
*
的惰性版本

要按此模式进行筛选并将输出写入文件,请使用以下命令:

:g/pattern/.w filename
因此,要按“first number=250和description中的'Greece'进行过滤”,并将输出写入到
Greece.out

:g/^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)\s\+.\{-}Greece/.w greece.out

更复杂的范围很快让这变得更加荒谬;您最好对文件进行解析,并使用regex以外的其他工具进行过滤。

请使用输入和输出示例?这里有相关工具。为什么要在文本编辑器中执行此操作?使用电子表格。概念证明:我只是想知道它在Vim中是否可行,即使不合理。awk天生就是做这种事情的。如果你真的想在vim中做这件事。您可以编写一个函数,将行拆分为列表,您可以使用不同的逻辑过滤不同的字段。我不建议使用正则表达式来进行这种过滤。感谢您详尽的回答,这似乎证实了Romaill所说的:对于这类问题,Vim只能导致一个“可行”的装置(我不针对您的回答,您的回答非常清楚这个过程是荒谬的)。再次感谢。
:g/^\s*-\([5-9][0-9]\|[1-9][0-9]\{2,}\)\s\+\(2[5-9][0-9]\|[3-9][0-9]\{2,}\)\s\+.\{-}Greece/.w greece.out