1

假设我有这个文本文件。我想抓住其中有电影的台词,匹配标题,打印并根据标题排序。我得到了大部分的方法:

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

...
4

3 回答 3

1

给定的正则表达式不会捕获带有逗号 (',')、点 ('.') 或其他奇怪内容(如德语变音符号 'ä'、感叹号(“火星袭击!”!!))的电影标题。

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

因此,要么将文件分成几部分,其中竖线(“|”)是字段分隔符并选择第二个字段,例如:

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

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

或在红宝石中使用类似的东西

line.split("|")[1]

请注意,在这两种情况下,您都可以在之后摆脱空格。

于 2013-10-31T11:53:08.383 回答
1

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

使用 egrep 您可以通过管道将结果进行排序:

egrep -o "\|\s([A-Z0-9][A-Za-z0-9: ]+)\s+\|" sort_movie_list.feature | sort
于 2013-10-31T07:12:43.260 回答
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

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

于 2013-10-31T07:46:48.113 回答