Ruby grep с номером строки - PullRequest
10 голосов
/ 23 апреля 2011

Что может быть лучшим способом получения совпадающих строк с номерами строк с использованием метода Enumerable#grep Руби.(поскольку мы используем переключатель -n или --line-number с командой grep).

Ответы [ 9 ]

8 голосов
/ 23 апреля 2011

Enumerable # grep не позволяет вам сделать это, по крайней мере, по умолчанию. Вместо этого я придумал:

text = 'now is the time
for all good men
to come to the aid
of their country'

regex = /aid/

hits = text.lines.with_index(1).inject([]) { |m,i| m << i if (i[0][regex]); m }
hits # => [["to come to the aid\n", 3]]
7 голосов
/ 23 апреля 2011

может быть что-то вроде этого:

module Enumerable
  def lgrep(pattern)
    map.with_index.select{|e,| e =~ pattern}
  end
end
4 голосов
/ 23 апреля 2011

Это не изящно и не эффективно, но почему бы просто не пронумеровать строки перед grepping?

1 голос
/ 23 апреля 2011

Чтобы растереть ответы Жестянщика и ghostdog74

text = 'now is the time
for all good men
to come to the aid
of their country'

regex = /aid/

text.lines.grep(/aid/){|x| puts "#{text.lines.find_index(x)+1}, #{x}" }
# => 3, to come to the aid
1 голос
/ 23 апреля 2011
>> lines=["one", "two", "tests"]
=> ["one", "two", "tests"]
>> lines.grep(/test/){|x| puts "#{lines.index(x)+1}, #{x}" }
3, tests
1 голос
/ 23 апреля 2011

Вы можете использовать его в Ruby 1.8.6 следующим образом:

require 'enumerator'
class Array
  def grep_with_index(regex)
    self.enum_for(:each_with_index).select {|x,i| x =~ regex}
  end
end
arr = ['Foo', 'Bar', 'Gah']
arr.grep_with_index(/o/) # => [[0, 'Foo']]
arr.grep_with_index(/a/) # => [[1, 'Bar'], [2, 'Gah']]

Или, если вы ищете советы по написанию подобной grep утилиты в Ruby.Примерно так должно работать:

def greplines(filename, regex)
  lineno = 0
  File.open(filename) do |file|
    file.each_line do |line|
      puts "#{lineno += 1}: #{line}" if line =~ regex
    end
  end
end
0 голосов
/ 16 мая 2018

Другое предложение:

lines.find_index{ |l| l=~ regex }.

0 голосов
/ 24 мая 2013

Поместить текст в файл

test.log

 now is the time
 for all good men
 to come to the aid
 of their country

Командная строка (альтернатива команде grep или awk)

ruby -ne ' puts $_  if $_=~/to the/' test.log

Попробуйте также

ruby -na -e ' puts $F[2] if $_=~/the/' test.log

Аналогично

ruby -na -e ' puts $_.split[2] if $_=~/the/' test.log

Это похоже на команду awk.

0 голосов
/ 24 апреля 2011

Модификация решения, данного Жестяным Человеком.Этот фрагмент вернет хеш с номерами строк в качестве ключей и соответствующими строками в качестве значений.Этот также работает в ruby ​​1.8.7.

text = 'now is the time
for all good men
to come to the aid
of their country'

regex = /aid/


hits = text.lines.each_with_index.inject({}) { |m, i| m.merge!({(i[1]+1) => i[0].chomp}) if (i[0][regex]); m}

hits #=> {3=>"to come to the aid"} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...