Sed replace using same pattern repeating multiple times in a line


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Sed replace using same pattern repeating multiple times in a line
# 1  
Old 10-15-2012
CPU & Memory Sed replace using same pattern repeating multiple times in a line

Sed replace using same pattern repeating multiple times in a line

I have text like below in a file:

Quote:

/*<tagz>*/hello.unix some random text and /*<tag1>*/bye.unix
I am trying to replace the above line to following
Quote:

/*<tagz>*/${tagz}.unix some random text and /*<tag1>*/${tag1}.unix
How can I acheive this?

I am able to do it if the occurrence is for 1 time:

Quote:

echo "/*<tagz>*/hello.unix some random text" | sed -e '/\*</s/\/\*<\(.*\)>\*\/\(.*\)\./\/\*<\1>\*\/\$\{\1}\./g'
But If I try like below
Quote:

echo "/*<tagz>*/hello.unix some random text and /*<tag1>*/bye.unix" | sed -e '/\*</s/\/\*<\(.*\)>\*\/\(.*\)\./\/\*<\1>\*\/\$\{\1}\./g'
I am getting like this:
Quote:

/*<tagz>*/.unix some random text and /*<tag1>*/${tagz>*/.unix some random text and /*<tag1}.unix
I have to limit it to every occurrence of the pattern.
Thanks for your help.

Last edited by sol_nov; 10-15-2012 at 09:48 PM..
# 2  
Old 10-15-2012
You're falling victim to the greedy match. Have a go with this:

Code:
echo "/*<tagz>*/${tagz}.unix some random text and /*<tag1>*/${tag}.unix" | sed -E 's!\*<([^>]*)>[^.]*\.!*<\1>*/${\1}.!g'

Only tried it on your sample and one other contrived example, so it might not be perfect. I also prefer using -E to avoid escaping parens which just make it messy. If you are using a BSD based sed it'll be a different (-r or -R, I cannot remember and my BSD box isn't up right now).

Last edited by agama; 10-15-2012 at 09:19 PM.. Reason: small tweek to ensure *< and not just <tag
# 3  
Old 10-15-2012
I don't see the pattern you're trying to match nor the desired change you want from your example. You seem to say that you want to change
Code:
/*<tagz>*/hello.

to:
Code:
/*<tagz>*/${tagz}.

which I can easily make happen, but then you want the same substitution command to change
Code:
/*<tag2>*/bye.

to:
Code:
/*<tag1>*/<tag>.

which seems entirely different.

Please describe in words the pattern you are trying to match and describe the replacement that you want to make for that pattern.
# 4  
Old 10-15-2012
Sorry for the typo:

I am trying to match the pattern
Quote:
/*<tagz>*/hello.
Quote:
/*<tag1>*/bye.
hello and bye are not same always, there can be anything in place hello and bye.

I am trying to remember the value and repalce it like below:
Quote:
/*<tagz>*/${tagz}.
---------- Post updated at 07:54 PM ---------- Previous update was at 07:51 PM ----------

Quote:
Originally Posted by agama
You're falling victim to the greedy match. Have a go with this:

Code:
echo "/*<tagz>*/${tagz}.unix some random text and /*<tag1>*/${tag}.unix" | sed -E 's!\*<([^>]*)>[^.]*\.!*<\1>*/${\1}.!g'

Only tried it on your sample and one other contrived example, so it might not be perfect. I also prefer using -E to avoid escaping parens which just make it messy. If you are using a BSD based sed it'll be a different (-r or -R, I cannot remember and my BSD box isn't up right now).
-E illegal option
# 5  
Old 10-15-2012
OK. The following should work with any sed that conforms to the standards:
Code:
sed 's|/\*<\([^>]*\)>\*/[^.]*.|/*<\1>*/${\1}.|g'

Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. Shell Programming and Scripting

sed command to replace one value which occurs multiple times

Hi, My Input File : "MN.1.2.1.2.14.1.1" := "MN_13_TM_4" ( 000000110110100100110001111110110110101110101001100111110100011010110111001 ) "MOS.1.2.1.2.13.6.2" := "MOS_13_TM_4" ( 000000110110100100110001111110110110101110101001100111110100011010110111001 ) Like above template,I have... (4 Replies)
Discussion started by: Preeti Chandra
4 Replies

2. Shell Programming and Scripting

Indexing each repeating pattern of rows in a column using awk/sed

Hello All, I have data like this in a column. 0 1 2 3 0 3 4 5 6 0 1 2 3 etc. where 0 identifies the start of a pattern in my data. So I need the output like below using either awk/sed. 0 1 (2 Replies)
Discussion started by: ks_reddy
2 Replies

3. Shell Programming and Scripting

Multiple line search, replace second line, using awk or sed

All, I appreciate any help you can offer here as this is well beyond my grasp of awk/sed... I have an input file similar to: &LOG &LOG Part: "@DB/TC10000021855/--F" &LOG &LOG &LOG Part: "@DB/TC10000021852/--F" &LOG Cloning_Action: RETAIN &LOG Part: "@DB/TCCP000010713/--A" &LOG &LOG... (5 Replies)
Discussion started by: KarmaPoliceT2
5 Replies

4. Shell Programming and Scripting

sed command to grep multiple pattern present in single line and delete that line

here is what i want to achieve.. i have a file with below contents cat fileName blah blah blah . .DROP this REJECT that . --sport 7800 -j REJECT --reject-with icmp-port-unreachable --dport 7800 -j REJECT --reject-with icmp-port-unreachable . . . more blah blah blah --dport 3306... (14 Replies)
Discussion started by: vivek d r
14 Replies

5. Shell Programming and Scripting

Sed/awk/perl command to replace pattern in multiple lines

Hi I know sed and awk has options to give range of line numbers, but I need to replace pattern in specific lines Something like sed -e '1s,14s,26s/pattern/new pattern/' file name Can somebody help me in this.... I am fine with see/awk/perl Thank you in advance (9 Replies)
Discussion started by: dani777
9 Replies

6. Shell Programming and Scripting

I need to know how to replace a line after a pattern match with an empty line using SED

Hi How Are you? I am doing fine! I need to go now? I will see you tomorrow! Basically I need to replace the entire line containing "doing" with a blank line: I need to the following output: Hi How Are you? I need to go now? I will see you tomorrow! Thanks in advance.... (1 Reply)
Discussion started by: sags007_99
1 Replies

7. Shell Programming and Scripting

Replace everything but pattern in a line using sed

I have a file with multiple lines like this: <junk><PATTERN><junk><PATTERN><junk> <junk><PATTERN><junk><PATTERN><junk><PATTERN><junk> Note that 1. There might be variable number occurrences of PATTERN in a line. 2. <> are just placeholders, they do not form part of the pattern. I need... (4 Replies)
Discussion started by: flatley
4 Replies

8. Shell Programming and Scripting

Sed Replace repeating pattern

Hi, I have an sqlplus output file using the character ';' as a delimiter and I would like to replace the fields without datas (i.e delimited by ';;') by ';0;' Example: my sqlplus output: 11;22;33;44;;;77;; What I would like to have: 11;22;33;44;0;0;77;0; Thanks in advance for your... (2 Replies)
Discussion started by: popesk
2 Replies

9. Shell Programming and Scripting

Sed Replace a repeating character

I have a text file and every line ends in |^ |^^ |^^^ |^^^^ I need to use sed to make all lines end it |^ regardless of the amount of carrots. The code i was using is: cat FILE | sed 's/\^\^\^/\^/g' But then they threw that curveball at me. Also is there a way to... (2 Replies)
Discussion started by: insania
2 Replies

10. Shell Programming and Scripting

sed - Replace Line which contains the Pattern match with a new line

I need to replace the line containing "STAGE_DB" with the line "STAGE_DB $DB # database that contains the table being loaded ($workingDB)" Here $DB is passed during the runtime. How can I do this? Thanks, Kousikan (2 Replies)
Discussion started by: kousikan
2 Replies
Login or Register to Ask a Question