2012-07-17 78 views
0

我是Ruby新手。我过去曾使用过shell。我将一个shell程序转换为ruby。我有以下命令:红宝石猫壳相似

cmd="cat -n " + infile + " | grep '127.0.0.1 '" + site 
f = %x[#{cmd}] 

shell cat命令返回我正在查找的行和行号。我希望能够在不使用shell的情况下在ruby中做类似的事情。可能需要将此程序移植到Windows。我可以在ruby中使用grep函数,但是如何返回行号而不必循环访问文件中的一百万行。谢谢。

回答

2

这里有一个小红宝石的功能,可以做你要求的。你必须循环每一行,但grep也是这样做 - 你只是不必自己做。幸运的是,红宝石使得循环容易:

def mygrep(filename, regex) 
    result = [] 
    File.open(filename) do |f| 
     f.each_with_index do |l, i| 
      result << [i, l] if regex =~ l 
     end 
    end 
    return result 
end 

干杯!

+0

压缩它更多:'File.open(f).each_with_index do | l,i | ...结束' – 2012-07-17 19:18:48

+0

@KassymDorsel - 如果你给[File.open](http://www.ruby-doc.org/core-1.9.3/File.html#method-c-open)一个块,该文件在块返回时自动关闭。我几乎总是这样做,因为我认为它更方便。 – 2012-07-17 19:25:46