0

我不知道这个标题是否足够……</p>

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

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

整数是 >-10000 和 < 10000

我的问题是:我怎么能

a) 使用“第一个整数 <= 1000”和“第二个整数 >=250”和“文本包含:波士顿或纽约”等标准过滤此文件

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 <=-50 AND EndDate >=0 AND Description 包含希腊的项目,结果过滤器 => 第 2 行

4

1 回答 1

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

因此,要按“第一个数字 <= -50 AND 第二个数字 >= 250 AND 'Greece' in description”进行过滤,并将输出写入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

更复杂的范围很快使这变得更加荒谬;您最好解析文件并使用正则表达式以外的其他内容进行过滤。

于 2013-08-12T20:29:03.767 回答