Reputation: 8755
The title speaks for itself really. I only want to know if it exists, not where it is. Is there a one liner to achieve this?
Upvotes: 45
Views: 54276
Reputation: 1199
File.open(filename).grep(/string/)
This loads the whole file into memory (slurps the file). You should avoid file slurping when dealing with large files. That means loading one line at a time, instead of the whole file.
File.foreach(filename).grep(/string/)
It's good practice to clean up after yourself rather than letting the garbage collector handle it at some point. This is more important if your program is long-lived and not just some quick script. Using a code block ensures that the File
object is closed when the block terminates.
File.foreach(filename) do |file|
file.grep(/string/)
end
Upvotes: 52
Reputation: 33732
This reads the file only to the first appearance of 'string' and processes it line by line - not reading the whole file at once.
def file_contains_regexp?(filename,regexp)
File.foreach(filename) do |line|
return true if line =~ regexp
end
return false
end
Upvotes: 1
Reputation: 107728
If your OS has a grep package, you could use a system call:
system("grep meow cat_sounds.txt")
This will return true if grep
returns anything, false if it does not.
If you find yourself on a system with grep
, you may find this is the "best" way because Ruby can be slow when it comes to file operations.
Upvotes: 7
Reputation:
Well it seems eed3si9n has the one liner down, here's the longer solution:
f = File.new("file.txt")
text = f.read
if text =~ /string/ then
#relevant code
end
Upvotes: 3
Reputation: 95624
grep for foo OR bar OR baz, stolen from ruby1line.txt.
$ ruby -pe 'next unless $_ =~ /(foo|bar|baz)/' < file.txt
Upvotes: 10