我不知道这个标题是否合适......
我们假设我有一个文件(> 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行
答案 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
更复杂的范围很快使这更加荒谬;你可能最好解析文件并使用正则表达式之外的其他东西进行过滤。