2012-05-31 11 views
7

Es ist eine sehr lange Zeit her, seit ich Ruby für solche Dinge verwendet habe, aber ich vergesse, wie man eine Datei öffnet, nach einer Zeichenkette sucht und druckt, was Rubin findet. Hier ist, was ich habe:Ruby find string in Datei und Druckergebnis

#!/usr/bin/env ruby 
f = File.new("file.txt") 
text = f.read 
if text =~ /string/ then 
puts test 
end 

ich bestimmen wollen, was die „Document-Root“ (Routen) ist in config/routes.rb

Wenn ich die Zeichenfolge zu drucken, wird die Datei druckt.

Ich fühle mich dumm, dass ich mich nicht erinnere, was das ist, aber ich muss es wissen.

Hoffentlich kann ich es dies machen drucken:

# Route is: 
blah blah blah blah 
+1

Möchten Sie nicht über jede Zeile und nicht über die gesamte Datei iterieren? In jedem Fall wird eine einfache Websuche eine Fülle von Beispielen dafür bieten. –

Antwort

1

Innen text Sie die gesamte Datei als String haben, können Sie entweder Match gegen eine .match mit regexp oder als Dave Newton vorgeschlagen verwenden, können Sie einfach Iteriere über jede Zeile und überprüfe. Etwas wie:

f.each_line { |line| 
    if line =~ /string/ then 
    puts line 
    end 
} 
8
File.open 'file.txt' do |file| 
    file.find { |line| line =~ /regexp/ } 
end 

dass die erste Zeile zurückkehren, die den regulären Ausdruck übereinstimmt. Wenn Sie alle übereinstimmenden Linien möchten, ändern Sie find zu find_all.

Es ist auch effizienter. Es iteriert nacheinander über die Zeilen, ohne die gesamte Datei in den Speicher zu laden.

Auch die grep Verfahren verwendet werden können:

File.foreach('file.txt').grep /regexp/ 
2

Der einfachste Weg, um die Wurzel zu bekommen, ist zu tun:

rake routes | grep root 

Wenn Sie es in Ruby tun wollen, würde ich gehen mit:

File.open("config/routes.rb") do |f| 
    f.each_line do |line| 
    if line =~ /root/ 
     puts "Found root: #{line}" 
    end 
    end 
end 
+1

Danke, dass Sie das OP auf 'Rake Routes' hingewiesen haben. Mein einziger Vorschlag wäre, dass man fgrep oder 'grep --fixed-strings' verwenden sollte, wenn man nicht versucht, einen regulären Ausdruck zu finden. –

+0

+1 für 'Rake-Routen'. –