Поиск строки в файле (ruby)

#ruby

#ruby

Вопрос:

Я использовал:

 open("some.txt") { |f| f.each_line.detect { |line| /re/.match(line) } }
  

Это показывает мне только первый раз, когда эта строка появляется в этом файле. Как мне распечатать ВСЕ строки, содержащие эту строку.

Комментарии:

1. File.readlines("some.txt").select { |line| /re/.match(line) }

Ответ №1:

detect возвращает только первую строку. find_all выдаст вам массив всех совпадающих строк.

Ответ №2:

Добавление ответа @Some Guy.

У вас также есть #select, который, я думаю, используется чаще.

Бонус: вы можете использовать метод #[] вместо a regex#match . Это должно быть немного быстрее, и в вашем случае работает отлично.

 open("some.txt") { |f| f.each_line.select { |line| line['re'] } }
  

Комментарии:

1. select — это псевдоним для find_all

2. @SomeGuy я вижу это чаще. В любом случае, это всего лишь мое мнение.

3. Достаточно справедливо. Я нахожу интересным, что detect и find_all являются оригиналами, а также находят и выбирают псевдоним для них. ИМХО было бы разумнее, если бы detect / select или find / find_all были сопряжены. Случайная мысль.

4.В Eunumerable select и find_all одинаковы: github.com/ruby/ruby/blob/trunk/enum.c#L3240-L3241 , но Array#select отличается: github.com/ruby/ruby/blob/v2_1_2/array.c#L5658 . Array#find_all возвращается к Enumerable версии. Так что, возможно, select это быстрее при работе с массивами. В этом случае похоже, что они одинаковы.

Ответ №3:

Вы можете получить искомое поведение с помощью чего-то вроде этого:

 File.open("some.txt") do |f|
  f.each do |line|
    puts line if line =~ /re/
  end
end
  

Если вам действительно нужен массив, каждая строка которого соответствует регулярному выражению, #find_all это правильный путь:

 File.open("some.txt") do |f|
  lines = f.find_all {|line| line =~ /re/ }
end