2014-02-20 60 views
1

我有一个CSV文件的给定列表中的所有线路,每一个线,但与许多第一次启动,看起来像这样:Vim的:正则表达式来删除除开头的号码

subject,parameter1,parameter2,parameter3 
1,blah,blah,blah 
3,blah,blah,blah 
2,blah,blah,blah 
44,blah,blah,blah 
12,blah,blah,blah 
14,blah,blah,blah 
11,blah,blah,blah 
10,blah,blah,blah 
11,blah,blah,blah 
13,blah,blah,blah 
3,blah,blah,blah 
... 

我想删除除开始的第一行外的所有行,例如1,6,12。 我是想这样的事情:

:g!/^[1 6 12]\|^subject/d 

但12被解释为“1或者2”,所以这也将删除与2开头的行..

我缺少什么,又该成为最有效的方法吗? 顺便说一句,而不是1,6,12,我的列表包含许多单倍数和2位数字。

回答

2

使用一个全球性的比赛:

:v/^\(subject\|1\|6\|12\),/ delete 

每行不匹配正则表达式,将其删除。

它产生:

subject,parameter1,parameter2,parameter3 
1,blah,blah,blah 
12,blah,blah,blah 

编辑:刚才我意识到,你已经使用全局匹配。你的错误在角色类中。它匹配任何字符,不管重复的字符,在你的情况下,数字1,2,6和一个空格。你必须把它们分成不同的分支,就像我之前做的那样。

+0

顺便说一句,':v'是':g!'的同义词。 – benjifisher

3

“功能性的” 替代:

:g/./if index([1,12,6],str2nr(split(getline("."),",")[0]))<0|exec 'normal! dd'|endif 
3

的字符类[1 6 12]装置“的任何单个字符,该字符在这个类中,
' ', 1, 2, 6任一项(重复1被忽略)

你可以使用

:g!/^1,\|^6,\|^12,\|^subject/d 

这是接近你的原始语法 - 但它的工作原理(在Mac OS X上用vim测试过)。

注 - 包括逗号是很重要的,这样line starting with 1不“保护” 1112345

虽然你可能想以不同的方式做到这一点 - 使用grep

把所有的“白名单”的数字在一个文件中,每行一个,像这样:

^subject 
^1, 
^2, 
^6, 
^12, 

然后做

grep -f whitelist csvFile 

和输出将是你的“编辑”文件(您可以管道到一个新的文件)。

如果你有更感兴趣的是“效率”,你可以让你的文本文件(让我们继续称它为whitelist)只是

subject 
1 
2 
6 
12 

,并使用下面的命令:

cat whitelist | xargs -I {} grep "^"{}"," cvsFile 

这需要一点解释。

xargs   - take the input one line at a time 
-I {}   - and insert that line in the command that follows, at the {} 

这意味着grep命令将(在白名单文件中每行一次)运行n次,每一次被送入grep正则表达式将是

"^"    - start of line 
{}    - contents of one line of the input file (whitelist) 
","    - comma that follows the number 
级联

因此,这是写作

grep "^subject," csvFile; grep "^1," csvFile; grep "^2," csvFile; 

一种紧凑的方法

它的优点是您现在可以以任何您想要的方式生成白名单 - 只要它以文件结尾,一次一行,就可以使用它;缺点是你基本上运行grep n次。如果你的文件变得非常大,并且你的白名单中有大量的项目,那可能会出现问题;但由于您的操作系统可能会在第一次读取后将文件放入缓存中,因此速度非常快。使用^锚点可以使正则表达式非常高效 - 只要它找不到匹配,就会继续下一行。

+0

希望我可以upvote的grep技巧,但没有足够的声誉 – geo909

+0

@ geo909 - 我很乐意接受你的赞美,而不是upvote! – Floris

+1

@ geo909 - 我只是添加了另一个(更好?)grep技巧... – Floris