2013-10-31 41 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