在文件中搜索字符串的最佳方法是什么?

Chr*_*mbo 40 ruby

标题真的说明了一切.我只想知道它是否存在,而不是它的存在.是否有一个班轮实现这一目标?

Ada*_*amK 45

File.open(filename).grep(/string/)
Run Code Online (Sandbox Code Playgroud)

这会将整个文件加载到内存中.如果您正在处理大文件,请更喜欢啜饮它们.
这意味着一次加载一行,而不是整个文件.

File.foreach(filename).grep(/string/)
Run Code Online (Sandbox Code Playgroud)

最好是自己清理,而不是让垃圾收集器在某个时候处理它.如果你的程序是长寿的而不仅仅是一些快速的脚本,这一点更为重要.使用代码块可确保File在块终止时关闭对象.

File.foreach(filename) do |file|
  file.grep(/string/)
end
Run Code Online (Sandbox Code Playgroud)

  • 这实际上泄漏了文件描述符,这可能会导致严重的问题.这是一个更清洁的替代方案,它将在使用后关闭文件.`open('some.txt'){| f | f.grep(/ string /)}` (46认同)
  • 并且还导致将整个文件加载到内存中.`open("some.txt"){| f | f.each_line.detect {| line | /re/.match(line)}}` (14认同)
  • -1因为某些原因它应该为true时返回false.调查原因. (2认同)
  • 伙计们,我认为File#grep无法将文件拖入内存.你能在博士中向我展示一下吗? (2认同)

Eug*_*ota 10

grep for foo OR bar OR baz,从ruby1line.txt偷来的.

$  ruby -pe 'next unless $_ =~ /(foo|bar|baz)/' < file.txt
Run Code Online (Sandbox Code Playgroud)


Rya*_*igg 6

如果您的操作系统具有grep软件包,则可以使用系统调用:

system("grep meow cat_sounds.txt")
Run Code Online (Sandbox Code Playgroud)

如果grep返回任何内容,则返回true,否则返回false。

如果您在使用的系统上找到自己grep,则可能会发现这是“最佳”方法,因为Ruby在进行文件操作时可能会变慢。

  • 我认为最好假设他是理智的。 (15认同)
  • 他还没有指定他的操作系统= \ (2认同)