For Programmers: Free Programming Magazines  


Home > Archive > Unix Programming > November 2005 > Sed to match multiple patterns









You are viewing an archived Text-only version of the thread. To view this thread in it's original format and/or if you want to reply to this thread please [click here]

 

Author Sed to match multiple patterns
solaris9000@gmail.com

2005-11-25, 7:57 am

Hello

I have got a file called "filename" like this:

#
#
path1 something1
#
path2 something2
#

I'd like to append "flag" to each line beginning path1 and path2 so the
file becomes:

#
#
path1 something1 flag
#
path2 something2 flag
#

I'd like to use sed for this. So far I can only match one pattern at a
time in sed. eg

sed '/path1/ s/$/ flag/' filename
sed '/path2/ s/$/ flag/' filename

Is there anyway I can combine both patterns in one line?

eg sed '/pattern1/ && /pattern2/ s/$/flag/' filename - I know this
doesnt work.

Thanks in advance.

Thomas Maier-Komor

2005-11-25, 7:57 am

solaris9000@gmail.com wrote:
> Hello
>
> I have got a file called "filename" like this:
>
> #
> #
> path1 something1
> #
> path2 something2
> #
>
> I'd like to append "flag" to each line beginning path1 and path2 so the
> file becomes:
>
> #
> #
> path1 something1 flag
> #
> path2 something2 flag
> #
>
> I'd like to use sed for this. So far I can only match one pattern at a
> time in sed. eg
>
> sed '/path1/ s/$/ flag/' filename
> sed '/path2/ s/$/ flag/' filename
>
> Is there anyway I can combine both patterns in one line?
>
> eg sed '/pattern1/ && /pattern2/ s/$/flag/' filename - I know this
> doesnt work.
>
> Thanks in advance.
>



sed '/path[12]/ s/$/ flag/' filename

Tom
Thomas Maier-Komor

2005-11-25, 7:57 am

Thomas Maier-Komor wrote:
> solaris9000@gmail.com wrote:
>
>
>
> sed '/path[12]/ s/$/ flag/' filename
>
> Tom


sorry to reply to my own post, but I could have been a little bit more
verbose...

you cannot specify multiple patterns - you must specify the pattern as
a single regular expression.

HTH,
Tom
solaris9000@gmail.com

2005-11-25, 7:00 pm

Thanks. That seems to have done the trick.

Ralf Fassel

2005-11-25, 7:00 pm

* solaris9000@gmail.com
| eg sed '/pattern1/ && /pattern2/ s/$/flag/' filename - I know this
| doesnt work.

In your special case the [12] does the trick. If you need truly
separate patterns, use multiple -e options:
sed -e 's/pattern1/replacement2/' -e 's/pattern2/replacement2/'

R'
clayne

2005-11-26, 3:58 am

Tom,

There is actually a semi-undocumented use of sed where you can also \
out extended regular expressions (even Solaris' installed-version of
sed supports it).

e.g.:

(sed acts like it doesn't know ex-regex):

$ (echo cat; echo dog; echo bird) | sed -e 's/(cat|dog)/rain/g'
cat
dog
bird

(now with backslash escaping):

$ (echo cat; echo dog; echo bird) | sed -e 's/\(cat\|dog\)/rain/g'
rain
rain
bird

shakahshakah@gmail.com

2005-11-26, 9:56 pm

solaris9000@gmail.com wrote:
> Hello
>
> I have got a file called "filename" like this:
>
> #
> #
> path1 something1
> #
> path2 something2
> #
>
> I'd like to append "flag" to each line beginning path1 and path2 so the
> file becomes:
>
> #
> #
> path1 something1 flag
> #
> path2 something2 flag
> #
>
> I'd like to use sed for this. So far I can only match one pattern at a
> time in sed. eg
>
> sed '/path1/ s/$/ flag/' filename
> sed '/path2/ s/$/ flag/' filename
>
> Is there anyway I can combine both patterns in one line?
>
> eg sed '/pattern1/ && /pattern2/ s/$/flag/' filename - I know this
> doesnt work.
>
> Thanks in advance.


How about :
sed -e '/path1/ s/$/ flag/' -e '/path2/ s/$/ flag/' filename

?

jc@sarah:~/tmp$ cat sed.test
#
#
path1 something1
#
path2 something2
#

jc@sarah:~/tmp$ sed -e '/path1/ s/$/ flag/' -e '/path2/ s/$/ flag/'
sed.test
#
#
path1 something1 flag
#
path2 something2 flag
#

shakahshakah@gmail.com

2005-11-26, 9:56 pm

solaris9000@gmail.com wrote:
> Hello
>
> I have got a file called "filename" like this:
>
> #
> #
> path1 something1
> #
> path2 something2
> #
>
> I'd like to append "flag" to each line beginning path1 and path2 so the
> file becomes:
>
> #
> #
> path1 something1 flag
> #
> path2 something2 flag
> #
>
> I'd like to use sed for this. So far I can only match one pattern at a
> time in sed. eg
>
> sed '/path1/ s/$/ flag/' filename
> sed '/path2/ s/$/ flag/' filename
>
> Is there anyway I can combine both patterns in one line?
>
> eg sed '/pattern1/ && /pattern2/ s/$/flag/' filename - I know this
> doesnt work.
>
> Thanks in advance.


How about :
sed -e '/path1/ s/$/ flag/' -e '/path2/ s/$/ flag/' filename

?

jc@sarah:~/tmp$ cat sed.test
#
#
path1 something1
#
path2 something2
#

jc@sarah:~/tmp$ sed -e '/path1/ s/$/ flag/' -e '/path2/ s/$/ flag/'
sed.test
#
#
path1 something1 flag
#
path2 something2 flag
#

Sponsored Links







Also available: Server administration forum archive | Web Design forum archive | Software forum archive | Hardware reviews archive

Copyright 2008 codecomments.com