[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

RE: matched string of a regular expression



> From: kamaraju kusumanchi [mailto:raju.mailinglists@gmail.com]
> Sent: Wednesday, March 04, 2009 3:24 PM
> Subject: OT: matched string of a regular expression
> 
> Consider the following file.
> 
> > cat junk.txt
> a(i)1b
> a(j)1b
> a(ij)1b
> a(ji)1b
> a(ijk)1b
> a(jik)1b
> a(ikj)1b
> a(jki)1b
> a(kij)1b
> a(kji)1b
> 
> In general the file is very long, might contain some other text. Now,
> I would like to replace all the occurrences of
> 
> a(ijk)1b with a(ijk)23b
> a(jik)1b with a(jik)23b
> a(ikj)1b with a(ikj)23b
> and so on for all the strings such as a(???)
> 
> Because of the size of the files involved, the number of files on
> which I have to perform this operation I decided to use sed (instead
> of doing it manually in vim)
> 
> However my sed script currently involves 6 lines (for all the
> combinations of ijk) such as
> 
> s/a(ijk)1b/a(ijk)23b/g
> s/a(jik)1b/a(jik)23b/g
> s/a(ikj)1b/a(ikj)23b/g
> and so on
> 
> This method is very cumbersome, not scalable. If I have to do similar
> operations on a(ijklm) the script would be 120 lines! Is there any way
> to write something like
> 
> s/a(???)1b/a(???)23b/g
> 
> where the second ??? is the string matched by the first regular
> expression.
> 
> In general, how can I obtain the string that is matched by a regular
> expression (in a shell script)?
> 
> BTW, Is sed the right tool for this kind of job? If not, can you
> suggest any other tool that will get the job done in less time?
> 
> PS: Please include my email in the CC.
> 
> thanks
> raju

I am not 100% certain this is what you are looking for, but here is my
attempt.
$ cat /tmp/junk.txt 
a(i)1b
a(j)1b
a(ij)1b
a(ji)1b
a(ijk)1b
a(jik)1b
a(ikj)1b
a(jki)1b
a(kij)1b
a(kji)1b
$ sed -e '/[ijk][ijk][ijk]/s/1b/23b/g' /tmp/junk.txt 
a(i)1b
a(j)1b
a(ij)1b
a(ji)1b
a(ijk)23b
a(jik)23b
a(ikj)23b
a(jki)23b
a(kij)23b
a(kji)23b

Also, this website is pure awesome. :-D
http://student.northpark.edu/pemente/sed/sed1line.txt

Hope this helps.
Have fun!
~Stack~


Reply to: