Problem With Replace Script


 
Thread Tools Search this Thread
Top Forums Shell Programming and Scripting Problem With Replace Script
# 1  
Old 12-05-2012
Problem With Replace Script

Hi,

I posted a topic requesting help with a script to replace certain things in an XML file

https://www.unix.com/shell-programmin...newline-2.html

The replies helped a lot but I found that on big files it didn't work properly.

The file I'm amending is in the following layout
Code:
<FUNCTION>
  <PRODUCTS>
    <PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no">
      <SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER">
        <STOCK_QUANTITY DATA="21"/>
        <STOCK_DATE DATA="1349284740"/>
      </SUPPLIER>
    </PRODUCT>
    <PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no">
      <SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER">
        <STOCK_QUANTITY DATA="21"/>
        <STOCK_DATE DATA="1349284740"/>
      </SUPPLIER>
    </PRODUCT>
    <PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no">
      <SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER">
        <STOCK_QUANTITY DATA="21"/>
        <STOCK_DATE DATA="1349284740"/>
      </SUPPLIER>
    </PRODUCT>
  </PRODUCTS>
</FUNCTION>

I want to convert it to the following format
Code:
<FUNCTION>
<PRODUCTS>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
</PRODUCTS>
</FUNCTION>

Now I can do this on small files using the following
Code:
printf '%s\n' '1,$s/^  *//' '1,$s/  *$//' 'g/^<PRODUCT / .,/^<\/PRODUCT>/j' w | ed -s file

But on large files it finishes and it is in the following format
Code:
<FUNCTION>
<PRODUCTS>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no"><SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER"><STOCK_QUANTITY DATA="21"/><STOCK_DATE DATA="1349284740"/></SUPPLIER></PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no">
<SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER">
<STOCK_QUANTITY DATA="21"/>
<STOCK_DATE DATA="1349284740"/>
</SUPPLIER>
</PRODUCT>
<PRODUCT CODE="PROD1" ACTION="amend" VALIDATE="no">
<SUPPLIER PRODUCT="SUPPPROD1" ACTION="amend" CODE="SUPPLIER">
<STOCK_QUANTITY DATA="21"/>
<STOCK_DATE DATA="1349284740"/>
</SUPPLIER>
</PRODUCT>
</PRODUCTS>
</FUNCTION>

So some of the records are amended but not all.

Could anyone possibly help me to get this to work for the whole file and not just part of it?

Thanks in advance! Smilie
# 2  
Old 12-05-2012
try:
Code:
awk '
/< *\/ *PRODUCT *>/ {ORS="\n";}
/< *PRODUCT / {ORS="";}
{ sub("^ *",""); sub(" *$",""); print $0; }
' input

# 3  
Old 12-05-2012
Thanks for the response, but I get the folowing errors
Code:
awk: syntax error near line 1
awk: illegal statement near line 1
awk: syntax error near line 1
awk: illegal statement near line 1

All I was running was
Code:
awk '/< *\/ *PRODUCT *>/ {ORS="\n";}/< *PRODUCT / {ORS="";}{ sub("^ *",""); sub(" *$",""); print $0; }' filename

# 4  
Old 12-05-2012
If your OS is Solaris or SunOS use nawk instead of awk
# 5  
Old 12-05-2012
try putting awk script in file a.awk:
Code:
/< *\/ *PRODUCT *>/ {ORS="\n";}
/< *PRODUCT / {ORS="";}
{ sub("^ *",""); sub(" *$",""); print $0; }

the in command line run:
Code:
awk -f a.awk filename

or use nawk as suggested above
# 6  
Old 12-06-2012
I appreciate the help, but putting the awk script in a file provides the same error and using nawk doesn't bring back the data I want.

It looks to have stripped most of the data out.

Essentially, I want to remove the leading spaces on each line and then replace
Code:
>
<SUPPLIER

with
Code:
><SUPPLIER

Code:
>
<STOCK

with
Code:
><STOCK

Code:
/>
</SUPPLIER>

with
Code:
/></SUPPLIER>

Code:
>
</PRODUCT>

with
Code:
></PRODUCT>

As I said, using the following code works, but has problems with larger files.
Code:
printf '%s\n' '1,$s/^  *//' '1,$s/  *$//' 'g/^<PRODUCT / .,/^<\/PRODUCT>/j' w | ed -s filename

Is there anything you could suggest?

I can go through each line and manipulate the data but it takes a long time, whereas the printf code works within a minute.


****EDIT****
Oh, I forgot to mention, the OS is Solaris
Login or Register to Ask a Question

Previous Thread | Next Thread

9 More Discussions You Might Find Interesting

1. UNIX for Beginners Questions & Answers

awk script to extract a column, replace one of the header and replace year(from ddmmyy to yyyy)

I have a csv which has lot of columns . I was looking for an awk script which would extract a column twice. for the first occurance the header and data needs to be intact but for the second occurance i want to replace the header name since it a duplicate and extract year value which is in ddmmyy... (10 Replies)
Discussion started by: Kunalcurious
10 Replies

2. UNIX for Dummies Questions & Answers

Search and replace problem

Hi, I am looking for bash or awk script to solve the following. Input File 1: >Min_0-t10270-RA|>Min_0-t10270-RA protein AED:0.41 eAED:0.46 QI:0|0|0|0.25|1|1|4|0|190 MIGLGFKYLDTSYFGGFCEPSEDMNKVCTMRADCCEGIEMRFHDLKLVLEDWRNFTKLST EEKRLWATPAAEDFF >Min_0-t10271-RA|>Min_0-t10271-RA protein... (5 Replies)
Discussion started by: Fahmida
5 Replies

3. Homework & Coursework Questions

VI Search and Replace problem help...

Use and complete the template provided. The entire template must be completed. If you don't, your post may be deleted! 1. The problem statement, all variables and given/known data: Give the vi command for replacing all occurances of the string "DOS" with the string "UNIX" in the whole... (4 Replies)
Discussion started by: kbreitsprecher
4 Replies

4. Shell Programming and Scripting

problem with replace command with tr

I have a sample file like this 7829885 7831552 + 1 1667, 0, 35934936 35937087 - 2 1281,870, 0,1281, I would like to replace values starts with comma with just value like 0, to 0 or 1667, to 1667. I can do with this by using tr -d '0,' '0' <file But the... (2 Replies)
Discussion started by: repinementer
2 Replies

5. UNIX and Linux Applications

GNU sed - Search and Replace problem

Hi, The following code loops through every file with an error extension and then loops through all XML files in that directory and replaces the target character @ with / . The problem I have is that if there is more than one occurance of @ in each individual file it doesn't replace it. Any... (2 Replies)
Discussion started by: Fishn
2 Replies

6. Shell Programming and Scripting

Find and replace problem

i have a script that will find a certian pattern and replace it with blank space #!/bin/ksh for i in `cat test.txt | grep "UTILINET" | cut -c 172-191` do perl -pi -e 's/$i//g' test.txt echo "Completed" done the command gives some of the below strings 50032E1B ... (5 Replies)
Discussion started by: ali560045
5 Replies

7. Shell Programming and Scripting

find and replace problem

hi guys!!! i am writing a script in which i take an input from user and find it in a file and replace it. My input file looks like hi what your name? allrise my code looks is echo "Enter the name" read name FILE="/opt/name.txt" NEW_FILE="/opt/new_name.txt" exec 0<$FILE ... (3 Replies)
Discussion started by: allrise123
3 Replies

8. Shell Programming and Scripting

Multiline replace problem

I have a data of the form 0.0117843924 0. 0. 0. 0. 0.011036017 0. 0. 0. 0. 0.0103351669 0. 0. 0. 0. 4839.41211 0. 0. 0. 0. 4532.08203 0. 0. 0. 0. I would like to insert a couple of blank lines before the 4839 line, every time it appears. The numbers in the... (2 Replies)
Discussion started by: mathis
2 Replies

9. Shell Programming and Scripting

Problem with sed (search/replace)

Hi, In a file FILE, the following lines appear : WORD 8 8 8 ANOTHERWORD blabla ... Directly in the prompt, if I type $sed '/WORD/s/8/10/g' FILE it replace the 8's by 10's in file : $cat FILE WORD 10 10 10 ANOTHERWORD blabla ... (9 Replies)
Discussion started by: tipi
9 Replies
Login or Register to Ask a Question