How to find second match in a file

C

Cheyne Li

Hi, everyone

My code opens a file and read line by line to find a given string as
first match. After I found one, how can i find the second match, a
different string, which is supposed to appear several lines after the
line of first match in a fast way?

for example, the following is the contents of a file

ka;sdfjaskf;asdfjk
skdfkfkfkfkfkfkfkfkfk
aks;flasjklfjkassjfksa
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbasdfdask;fjsdkalf
*************hello world***************ka;sdjkf;sjadkfj
asdfkasjdkfldjaskl;jfklas;
jaskdl;fjkasdjkfljdskla;jdfs
jkasl;jfkasjdklfjsal;df
asjkdfjkasd;fd;asdfj
***********Ruby*********a;sjdfklsdjal;fjkda;
asdfjjasklfjkdasjkfjaskl;
fjdka;dfdjasjfsd;a

So, after I found the match "hello world" by using a while loop, how can
i find the "Ruby" in the same while loop?

Looking forward to your reply. Thanks in advance
 
R

Rodrigo Bermejo

Cheyne said:
Hi, everyone

My code opens a file and read line by line to find a given string as
first match. After I found one, how can i find the second match, a
different string, which is supposed to appear several lines after the
line of first match in a fast way?

for example, the following is the contents of a file

ka;sdfjaskf;asdfjk
skdfkfkfkfkfkfkfkfkfk
aks;flasjklfjkassjfksa
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbasdfdask;fjsdkalf
*************hello world***************ka;sdjkf;sjadkfj
asdfkasjdkfldjaskl;jfklas;
jaskdl;fjkasdjkfljdskla;jdfs
jkasl;jfkasjdklfjsal;df
asjkdfjkasd;fd;asdfj
***********Ruby*********a;sjdfklsdjal;fjkda;
asdfjjasklfjkdasjkfjaskl;
fjdka;dfdjasjfsd;a

So, after I found the match "hello world" by using a while loop, how can
i find the "Ruby" in the same while loop?

Looking forward to your reply. Thanks in advance
Not sure why you need it ...but seems you can do what you need by simple
doing this:
File.readlines("1.txt").each do |line|
if line =~ /hello world/
#do something
p line
end
if line =~ /Ruby/
#do something else
p line
end
end
 
R

Robert Klemme

2008/6/25 Cheyne Li said:
Hi, everyone

My code opens a file and read line by line to find a given string as
first match. After I found one, how can i find the second match, a
different string, which is supposed to appear several lines after the
line of first match in a fast way?

for example, the following is the contents of a file

ka;sdfjaskf;asdfjk
skdfkfkfkfkfkfkfkfkfk
aks;flasjklfjkassjfksa
aaaaaaaaaaaaaaaaaaaaaaaa
bbbbbasdfdask;fjsdkalf
*************hello world***************ka;sdjkf;sjadkfj
asdfkasjdkfldjaskl;jfklas;
jaskdl;fjkasdjkfljdskla;jdfs
jkasl;jfkasjdklfjsal;df
asjkdfjkasd;fd;asdfj
***********Ruby*********a;sjdfklsdjal;fjkda;
asdfjjasklfjkdasjkfjaskl;
fjdka;dfdjasjfsd;a

So, after I found the match "hello world" by using a while loop, how can
i find the "Ruby" in the same while loop?

It's probably easiest if you store the state of your search somewhere.

state = :initial

File.foreach "foo" do |line|
case state
when :initial
if /first/ =~ line
puts line
state = :first_match
end
when :first_match
if /second/ =~ line
puts line
state = :second_match
end
else
# ignore
end
end

Cheers

robert
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,982
Messages
2,570,186
Members
46,740
Latest member
JudsonFrie

Latest Threads

Top