Ruby 从命令行对文本文件的部分进行排序

Ruby 从命令行对文本文件的部分进行排序,ruby,sorting,grep,Ruby,Sorting,Grep,说我有。我想抓取其中包含电影的行,匹配标题,打印,并根据标题进行排序。我大部分时间都是通过: 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_m

说我有。我想抓取其中包含电影的行,匹配标题,打印,并根据标题进行排序。我大部分时间都是通过:

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

...

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

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

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

好的,我现在已经为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

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

给定的正则表达式不会捕捉到带有逗号(“,”)、圆点(“.”)或其他奇怪内容(如德语Umlauts“ä”、感叹词(“火星攻击!”)的电影标题

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

因此,可以将文件分成若干部分,其中管道(“|”)是字段分隔符,然后选择第二个字段,如:

grep "|" movies.txt | cut -f 2 -d"|" | sort
(grep“|”是省略没有电影的行,否则
cut-f2-d“|”movies.txt
就可以了)

或者在ruby中使用类似的东西

line.split("|")[1]

请注意,在这两种情况下,您都可以在以后去掉空格。

啊,是的。我不需要使用egrep提取标题,就可以使用sort对行进行正确排序。谢谢。再次查看您的输入文件时,最好只取范围内的字符,因为第二个“列”似乎是固定长度的。像这样,你甚至可以拍摄标题中带有管道符号的电影。