Ruby 检查文件是否包含字符串

Ruby 检查文件是否包含字符串,ruby,if-statement,Ruby,If Statement,所以我在这里发现了这个问题,但是我对输出有一个问题,以及如何用if语句处理它。这就是我所拥有的,但它总是说这是真的,即使文件中不存在monitor这个词 if File.readlines("testfile.txt").grep(/monitor/) do something end 它应该是==“nil”这样的值吗?我对ruby很陌生,不确定输出是什么。不返回布尔值;它返回一个数组(如果不传递块,您如何访问匹配项?) 如果未找到匹配项,则返回空数组,[]计算结果为true。您需要在if

所以我在这里发现了这个问题,但是我对输出有一个问题,以及如何用if语句处理它。这就是我所拥有的,但它总是说这是真的,即使文件中不存在monitor这个词

if File.readlines("testfile.txt").grep(/monitor/)
  do something
end
它应该是==“nil”这样的值吗?我对ruby很陌生,不确定输出是什么。

不返回布尔值;它返回一个数组(如果不传递块,您如何访问匹配项?)

如果未找到匹配项,则返回空数组,
[]
计算结果为
true
。您需要在
if
语句中检查数组的大小,即:

if File.readlines("testfile.txt").grep(/monitor/).size > 0
  # do something
end
对于此类问题,文档应该是您的第一资源。

我将使用:

if File.readlines("testfile.txt").grep(/monitor/).any?


使用
readlines
会有可伸缩性问题,因为它会将整个文件读取到一个数组中。相反,使用
foreach
将实现同样的功能,而不会出现可伸缩性问题:

if File.foreach("testfile.txt").grep(/monitor/).any?


有关可伸缩性问题的更多信息,请参阅“”。

Grep将为您提供一个包含所有找到的“监视器”的数组。但您不需要数组,而是需要布尔值:此文件中是否有“monitor”字符串? 这一个可以根据需要读取尽可能少的文件:

if File.open('test.txt').lines.any?{|line| line.include?('monitor')}
  p 'do something'
end

readlines读取整个文件,lines返回一个枚举数,该枚举数逐行执行

如果有人正在寻找一种解决方案来显示出现该字符串的文件的最后一行,只需执行以下操作

File.readlines('dir/testfile.txt').select{|l| l.match /monitor/}.last 
示例

文件:

monitor 1
monitor 2
something else
你会得到

monitor 2

+对于
any?
,这将在找到第一个匹配项时立即结束,而不是只处理每一行以查看是否有匹配项。请记住,这不是幂等项。连续运行两次将在第一次运行时返回
true
,在第二次运行时返回
false
。您需要在再次运行文件之前
倒带
。无需
倒带
readlines
将自动打开和关闭文件,因此它总是从开头开始,一直读到结尾。同样,对于
any?
,使用+1表示,尽管要快速澄清,但只要有匹配项,就立即返回的方法是
any?{…}
而不是
grep(…)。有吗?
。经过艰苦的学习,你应该更加关注:)@SRack你并不孤单。我也做了同样的事。我编辑了答案,将最佳方法放在第一位,然后显示备选方法,并说明为什么每个备选方法都不如顶级方法。注意:如果文件大于可用内存,使用
readlines
确实会导致问题。有关更多信息,请参阅“”。谢谢您的帖子。你帮了我很多忙。但我想知道我是否需要寻找一条路?@MZaragoza:取决于什么样的路。我敢肯定,如果您搜索正则表达式以匹配路径,您会找到很多示例。我正在查找一个类似“/www/assests/2015/09/18/someimage.png”的文件中的字符串。问题是,在其他路径的目录中有其他图像名称“someimage.png”。您可能希望在grep中使用正则表达式。对于eg;File.readlines(“/home/{os\u user}/.bash\u profile”).grep(%r{JAVA\u home=\/opt\/Oracle\/jdk})。是否为空?
monitor 1
monitor 2
something else
monitor 2