sed problem


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting sed problem
# 1  
Old 03-29-2011
sed problem

I am trying to use sed to make some changes to some HTML-like code. The code looks like this:

Code:
<aaa bbb="xxxx" params="@abc@ @defghi@ @j@"></aaa>
<aaa params="@abc@ @defghi@">value</aaa><aaa params="@klm@ @nopq@ @rstu@"></aaa>
<aaa params="@v@ @wxy@ @z@"></aaa>

There is an aaa tag which can take a "params" attribute. I am being asked to change the way that "params" works. Instead of:
Code:
params="@a@ @b@ @c"

I am being asked to use this syntax:
Code:
param1="@a@" param2="@b@" param3="@c@"

This gets complicated because:

1) Some of our code has multiple sets of "params" per line
2) There can be a variable number of parameters. Sometimes there will be one "params" value and sometimes there will be two, three, or four.

Any idea how to use sed to make the changes? Do you think sed is the right tool for this?
# 2  
Old 03-29-2011
Code:
awk '/params/{gsub(" @","\" params=\"",$0);i=1;do{sub("params","param"(i),$0);i++}while(match($0,/params/))}1' infile

Code:
[ctsgnb@shell ~/sand]$ cat tst
<aaa bbb="xxxx" params="@abc@ @defghi@ @j@"></aaa>
<aaa params="@abc@ @defghi@">value</aaa><aaa params="@klm@ @nopq@ @rstu@"></aaa>
<aaa params="@v@ @wxy@ @z@"></aaa>

Code:
[ctsgnb@shell ~/sand]$ awk '/params/{gsub(" @","\" params=\"@",$0);i=1;do{sub("params","param"(i),$0);i++}while(match($0,/params/))}1' tst
<aaa bbb="xxxx" param1="@abc@" param2="@defghi@" param3="@j@"></aaa>
<aaa param1="@abc@" param2="@defghi@">value</aaa><aaa param3="@klm@" param4="@nopq@" param5="@rstu@"></aaa>
<aaa param1="@v@" param2="@wxy@" param3="@z@"></aaa>
[ctsgnb@shell ~/sand]$

or
Code:
# nawk '{while(/params/){match($0,/<aaa[^>]*params[^>]*>/);x=substr($0,RSTART,RLENGTH);y=x;gsub(" @","\" params=\"@",x);do{sub("params","param"(++i),x)}while(match(x,/params/));sub(y,x,$0);i=0}}1' tst
<aaa bbb="xxxx" param1="@abc@" param2="@defghi@" param3="@j@"></aaa>
<aaa param1="@abc@" param2="@defghi@">value</aaa><aaa param1="@klm@" param2="@nopq@" param3="@rstu@"></aaa>
<aaa param1="@v@" param2="@wxy@" param3="@z@"></aaa>


Last edited by ctsgnb; 03-30-2011 at 08:36 AM..
This User Gave Thanks to ctsgnb For This Post:
# 3  
Old 03-29-2011
Code:
echo "<aaa bbb="xxxx" params="@abc@ @defghi@ @j@"></aaa>
<aaa params="@abc@ @defghi@">value</aaa><aaa params="@klm@ @nopq@ @rstu@"></aaa>
<aaa params="@v@ @wxy@ @z@"></aaa>" |
gawk '{gsub(/params=|\"/,"")}
{for(i=1;i<=NF;i++) {if($i~/@/) if($i~/aaa/){$i="params="++x"\""gensub(/>/,"\">",1,$i)} else {$i= "params="++x"\""$i"\""};if($i~/aaa/)x=0}}1'
<aaa bbb=xxxx params=1"@abc@" params=2"@defghi@" params=3"@j@"></aaa>
<aaa params=1"@abc@" params=2"@defghi@">value</aaa><aaa params=1"@klm@" params=2"@nopq@" params=3"@rstu@"></aaa>
<aaa params=1"@v@" params=2"@wxy@" params=3"@z@"></aaa>

This User Gave Thanks to yinyuemi For This Post:
# 4  
Old 03-29-2011
Impressive! Thank you.

Can I ask a more general question?

I don't know awk and I have been trying to avoid it. It seems very cryptic and hard to understand to me and I think the learning curve for me to pick it up will be steep.

Yet I do need to make these types of text substitutions.

What are my other options? Do you think I should bite the bullet and learn awk, or is there something else that would be easier for me to pick up?

Thanks again for your advice.
# 5  
Old 03-29-2011
Quote:
Originally Posted by RickS
Impressive! Thank you.

Can I ask a more general question?

I don't know awk and I have been trying to avoid it. It seems very cryptic and hard to understand to me and I think the learning curve for me to pick it up will be steep.

Yet I do need to make these types of text substitutions.

What are my other options? Do you think I should bite the bullet and learn awk, or is there something else that would be easier for me to pick up?

Thanks again for your advice.
Hi RickS,

Awk is very good tool to handle text, just like what you see, so I really recommend you to spend time to learn it if you will frequently handle your data in the future, it's worthy!

Good luck!

Best,

Y
Login or Register to Ask a Question

Previous Thread | Next Thread

10 More Discussions You Might Find Interesting

1. UNIX for Dummies Questions & Answers

sed Or Grep Problem OR Terminal Problem?

I don't know if you guys get this problem sometimes at Terminal but I had been having this problem since yesterday :( Maybe I overdid the Terminal. Even the codes that used to work doesn't work anymore. Here is what 's happening: * I wanted to remove lines containing digits so I used this... (25 Replies)
Discussion started by: Nexeu
25 Replies

2. UNIX for Dummies Questions & Answers

sed problem

Hi Folks, I want to replace these numbers with words as the following: $echo 1 11 223 I want to replace each number with it name (e.g. "1" replaced with "one", etc.) just to determine how sed works in such case. Thanks in advance:). Leo (8 Replies)
Discussion started by: leo_ultra_leo
8 Replies

3. Shell Programming and Scripting

sed problem

Hi i am stuck with a very silly problem :mad: below is my code echo 201010_1212_121.xml i need to replace xml with csv so i did echo 201010_1212_121.xml | sed 's/.*\.xml/.*\.csv/' echo 201010_1212_121.xml | sed 's/*.xml/*.csv/' echo 201010_1212_121.xml |... (4 Replies)
Discussion started by: aishsimplesweet
4 Replies

4. Programming

sed problem

Hi all In input file I have records like this: 0,1,0,87,0,0,"6,87","170,03",0,"43,5",0,0,0,0,"6,87","126,53"and in output file I need that these records transforms in : 0 1 0 87 0 0 6,87 170,03 0 43,5 0 0 0 0 6,87 126,53 Could you help me in this case? Please (3 Replies)
Discussion started by: shizik
3 Replies

5. Shell Programming and Scripting

SED - Problem

I have a file with a lot of numbers in it and I need to clean it up and make it look nice and proper. I found this little gem of a one-liner and basically understand what it is doing but I would like to further understand what each part of the command is doing. Being a newb, I am just trying to... (2 Replies)
Discussion started by: genedc1
2 Replies

6. Shell Programming and Scripting

Sed Problem

I have a file which contain many lines see below. "/var/www/abc>" I want to remove Both of these values "" and > (5 Replies)
Discussion started by: aliahsan81
5 Replies

7. Shell Programming and Scripting

Problem in sed.

Hi All! I am trying to use shell variables in a sed statement, but facing an error.I used the double quotes instead if single quotes in the sed statement. # sed -i -e "s/password/$decoded/g;" $CATALINA_HOME/conf/server.xml sed: -e expression #1, char 11: unterminated `s' command # ... (5 Replies)
Discussion started by: nua7
5 Replies

8. Shell Programming and Scripting

Problem with SED

Hi, I have to use SED to remove the prefix "219-" from a text file containing phone numbers and I have to remove the ":" as well. I write the following code but it does not seem to work. Can someone help me please? mohit@mohit-desktop:~$ sed -n s/219-/" "/p corp_phones_bak > noprefix1... (2 Replies)
Discussion started by: mojoman
2 Replies

9. UNIX for Dummies Questions & Answers

Problem with sed

Hi , echo "07/05/2008" | sed 's/\(..\)\/\(..\)\/\(..\)/\3\2\1/' Output :: 20050708 Expected output is 20080507 Iam not getting the bug in this. Thanks for the help -- penchal (4 Replies)
Discussion started by: penchal_boddu
4 Replies

10. UNIX for Dummies Questions & Answers

Sed Problem

I AM TRYING TO APPEND THE HOSTNAME OF A UNIX SERVER I WORK WITH SO I COULD DO A LOADING INTO A DATABASE. THE COMMAND I AM USING IS df -k | sed 's/^/dataserver /' What I intend to do is append the hostname dynamically by using the hostname command instead of having to manually enter... (1 Reply)
Discussion started by: Chelsea
1 Replies
Login or Register to Ask a Question