Ruby grep,匹配并返回

时间:2011-09-12 10:37:32

标签: ruby grep

无论如何都要检查文件中是否存在值而不总是遍历整个文件?

目前我用过:

if open('file.txt').grep(/value/).length > 0
  puts "match"
else 
  puts "no match"
end

但它效率不高,因为我只想知道它是否存在。非常感谢grep /其他类似单行的解决方案。

在向我投票之前请注意“总是”

3 个答案:

答案 0 :(得分:2)

如果您想使用单行进行逐行比较:

matches = open('file.txt') { |f| f.lines.find { |line| line.include?("value") } }
puts matches ? "yes" : "naaw"

答案 1 :(得分:1)

这是一个ruby单行程序,可以在linux命令行中对文本文件执行grep,并在第一次找到时停止。

ruby -ne '(puts "first found on line #{$.}"; break) if $_ =~ /regex here/' file.txt

-n获取文件中的每一行并将其提供给全局变量$ _

$。是一个存储当前行号的全局变量

如果要查找与正则表达式匹配的所有行,则:

ruby -ne 'puts "found on line #{$.}" if $_ =~ /regex here/' file.txt

答案 2 :(得分:0)

根据定义,您可以判断文件中是否存在任意表达式的唯一方法是遍历文件并查找它。如果您正在寻找第一个实例,那么平均而言,您将扫描文件的一半,直到找到它的表达式为止。如果表达式不存在,那么你将不得不扫描整个文件来解决这个问题。

您可以通过逐行扫描文件在单行中实现它。使用IO.foreach

如果您经常这样做,那么您可以通过首先索引文件来提高搜索效率,例如:通过使用Lucene。这是一个权衡 - 你仍然需要扫描文件,但只有一次,因为你将它的内容保存在一个更易于搜索的数据结构中。但是,如果您不经常访问给定文件,则可能不值得花费 - 实现,维护和额外存储。