2013-10-31 43 views
1

假设我有this text file。我想要抓住其中有电影的线条,根据标题匹配标题,打印和排序。我得到了最多的方式:从命令行排序文本文件的部分

File.open("features/sort_movie_list.feature","r").each {|line| puts [$1] if line =~ /\|\s+([A-Z0-9][a-zA-Z0-9: ]+)\s+\|/} 

但我不知道如何从那里排序。我得到了一些方式与grep

egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature 

,但不知道如何只打印括号匹配。你会怎么做,以便输出如下?

2001: A Space Odyssey 

Aladdin 

Amelie 

Chicken Run 

... 

回答

1

在您的ruby示例中,您可以将它们填充到数组中,对数组进行排序并打印出来。

随着egrep的,你可以管的结果进行排序:

egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature | sort 
+0

啊是的。我不需要仅仅使用egrep来提取标题来使用排序正确地对行进行排序。谢谢。 – magician11

0

好吧,我现在理解了它的Ruby。感谢David建议使用数组。

movie_titles = [] 
File.open("features/sort_movie_list.feature","r").each {|line| movie_titles.push($1.strip) if line =~ /\|\s+([A-Z0-9][a-zA-Z0-9: ]+)\s+\|/} 
puts movie_titles.sort 

如果有人有一个更有效/简洁的答案,我总是愿意学习更多。

1

给定的正则表达式不会用逗号(','),点('。')或其他奇怪的东西(如德语变音“ä”,感叹号(“火星攻击!”!!)) 。

因此,我会利用给定的格式,并假定管道不会出现在电影标题列表中。

因此,要么削减零件的文件,其中,所述管(“|”)是字段分隔符,并选择所述第二字段,如:

grep "|" movies.txt | cut -f 2 -d"|" | sort 

(该grep "|"是省略线而没有电影,否则cut -f 2 -d "|" movies.txt会这样做)。

或红宝石使用的东西沿线

line.split("|")[1] 

注意,在这两种情况下,你可以摆脱空格算账。

+0

是的,谢谢! http://pastebin.com/TvJQDXSm – magician11

+0

再次查看您的输入文件,它可能**甚至更好**只是将范围内的字符,因为第二个“列”似乎是固定长度。就像这样,你甚至可以在标题中用管道符号捕捉电影。 – Felix