Wyrażenie regularne - problem z wielolinijkowym plikiem

Witam.
Mam plik o zawartości np:
A B C
D E F
G H I
I chcę wczytać to co jest pomiędzy A i G.
Mam taki kod:

        file = File.open("plik.txt", "r")
        file.each {|l| if file =(/A\s(.*)G/i).match(l)
        then (puts #{$1}) end }

Jeśli chodzi o szukanie w jednej linii pliku, to działa…
Na kilku liniach działać nie chce.
Ma ktoś jakiś pomysł?
I oprócz tego jeśli po tym kodzie powyżej dodam file.close wywala mi błąd. Dlaczego?

Musisz użyć przełącznika /m, czyli multiline mode.

Poza tym sprawdzasz po jednej linijce, więc siłą rzeczy nie wyjdzie :wink: Użyj file.read do przeczytania całej zawartości pliku.

UPDATE:
A co do file.close - przypisujesz na file wynik match(), dlatego w tym miejscu file nie jest już plikiem.

Najfajniej jest zrobić:

File.open("plik.txt", "r") do |file| if file.read =~ /A(.*)G/im puts $1 end end
File.open z blokiem samo zadba o zamknięcie pliku.

Dzięki. Lecz jest problem… Mam dość spory plik.txt i wywala mi:
Stack overflow in regexp matcher:
Googlowałem co to, ale rozwiązania nie znalazłem.
Spotkał się ktoś z tym?

To wyżej to pod ruby 1.8.
Pod 1.9:
failed to allocate memory:

No jak jest taki błąd, to pewnie jest bug w Rubim :confused: Zgłoś na bugtrackerze

Wydaje mi się, że ten błąd jest już zgłoszony.
Hmm, to może ma ktoś inny pomysł jak rozwiązać problem?

@Riant: jak duży to jest plik ?

Spróbuj z metodą “scan” dla Stringa.

1857581 bajtów. ; P (1.8 mb)

Hmm, sprawdziłem na 5 Mb pliku to co podesłał drogus i działa, znajduje fragment i nie wysypuje się, mam

ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin8]

Pod 1.9 też u mnie działa i jest natychmiastowy wynik:

ruby 1.9.1p129 (2009-05-12 revision 23412) [i386-darwin8]

@Riant: podeślij jeszcze dokładną wersję Rubiego jakiej używasz (ruby -v) i spróbuj 1.8.7 jeśli masz 1.8.6

Mam: ruby 1.9.1p376 i ruby 1.8.7
Hmm może coś w kodzie jest nie tak skoro u Ciebie działa. Pokminię nad tym.

EDIT:
Wiem już co jest nie tak: plik. Na mniejszym pliku przykładowym czyta dobrze.
Ale na tym 1.8 mb wywala błąd. Więc skróciłem plik i działa.
Dzięki za pomoc. :wink: