Vim对文件进行多重过滤,具有基于数值的2个过滤器

时间:2013-08-12 17:58:51

标签: vim

我不知道这个标题是否合适......

我们假设我有一个文件(> 1000行),其中包含一个由空格分隔的三个“字段”的同构结构:

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

整数是> -10000且&lt; 10000

我的问题是:我怎么能

a)使用“1st integer&lt; = 1000”和“2nd integer&gt; = 250”和“text contains:Boston OR New-York”等标准过滤此文件

b)并将子集放在一个新的缓冲区中,允许我读取结果而只读取过滤器的结果?

我希望只与Vim这样做,不知道它是否可行或合理(无论如何它超出了我的技能)

谢谢


@FDinoff:对不起,我应该做你的建议,当然:

它可能是一个带有StartDate,EndDate和Description:

的年表
1 -200 -50 Period one in Italy
2 -150 250 Period one in Greece
3  -50  40 Period two in Italy 
4   10  10 Some event in Italy
5   20  20 Event two in Greece

过滤器可以是:过滤项目(模仿SQL)StartDate&lt; = - 50 AND EndDate&gt; = 0 AND Description包含希腊,结果过滤器=&gt;第2行

1 个答案:

答案 0 :(得分:1)

以下通用表单将与您格式的数字部分相匹配:

^\s*-\?\d\+\s\+-\?\d\+

要对数字实施限制,请使用更具体的模式替换每个-\?\d\+。例如,对于<= -50

-\([5-9][0-9]\|[1-9][0-9]\{2,}\)

即,-后跟一个2位数字,其中第一个数字> = 5,或者> = 3位数。

同样,>= 250

\(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

因此,要按照“第一个数字&lt; = -50 AND第二个数字&gt; = 250 AND'希腊'进行过滤”并将输出写入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

更复杂的范围很快使这更加荒谬;你可能最好解析文件并使用正则表达式之外的其他东西进行过滤。