标题真的说明了一切。我只想知道它是否存在,而不是它的存在。有没有一个班轮来实现这个目标?
答案 0 :(得分:43)
File.open(filename).grep(/string/)
这会将整个文件加载到内存中。 如果您正在处理大型文件,请更喜欢啜饮它们 这意味着一次加载一行,而不是整个文件。
File.foreach(filename).grep(/string/)
最好是自己清理,而不是让垃圾收集器在某个时候处理它。如果你的程序是长寿的而不仅仅是一些快速的脚本,这一点更为重要。使用代码块可确保在块终止时关闭File
对象。
File.foreach(filename) do |file|
file.grep(/string/)
end
答案 1 :(得分:10)
grep for foo OR bar OR baz,从ruby1line.txt被盗。
$ ruby -pe 'next unless $_ =~ /(foo|bar|baz)/' < file.txt
答案 2 :(得分:5)
如果您的操作系统有一个grep软件包,您可以使用系统调用:
system("grep meow cat_sounds.txt")
如果grep
返回任何内容,则返回true,否则返回false。
如果你发现自己在grep
的系统上,你会发现这是“最好的”方式,因为Ruby在文件操作方面可能会很慢。
答案 3 :(得分:2)
好吧,看来eed3si9n有一个内线,这是更长的解决方案:
f = File.new("file.txt")
text = f.read
if text =~ /string/ then
#relevant code
end
答案 4 :(得分:0)
这只会将文件读取到'string'的第一个外观 并逐行处理 - 不是一次读取整个文件。
def file_contains_regexp?(filename,regexp)
File.foreach(filename) do |line|
return true if line =~ regexp
end
return false
end