?
Solved

Search for a string in a line and replace it with another string from another file - Shell scripting

Posted on 2014-03-14
7
Medium Priority
?
270 Views
Last Modified: 2014-03-17
Hi Team,

I am writing a shell script which will procedure three output files

File: Source_Lun.txt
ud1001
ud1002
ud1003
un1001
un1002

File: Dest_Lun.txt
ud2001
ud2002
ud2003
un2001
un2002

File: CloneLuns.txt

/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud1001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_ud1002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_ud1003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_un1001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_un1002

Now, I want to produce the forth file which should replace the last string from file CloneLuns.txt with a string value from Dest_Lun.txt

for example:

Take a first line from the file CloneLuns.txt,
"/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud1001"

Take a first line from file Dest_Lun.txt,
ud2001

I want to replace only string ( ud1001) with ud2001 from both files and write it to another file ex: modified_luns.txt

so the output should be,

"/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2001"

and second line
and third line
and forth line so on ...

Can someone shed some light on it?

Thanks
Shankar
0
Comment
Question by:luser9999
  • 3
  • 2
  • 2
7 Comments
 
LVL 23

Assisted Solution

by:savone
savone earned 1000 total points
ID: 39929207
This may not be pretty....


[vonas@putor tmp]$ cat Dest_Lun.txt
ud2001
ud2002
ud2003
un2001
un2002


[vonas@putor tmp]$ cat CloneLuns.txt
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud1001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_ud1002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_ud1003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_un1001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_un1002


[vonas@putor tmp]$ for i in `cat CloneLuns.txt`; do OK=`echo $i | rev | cut -c 7- | rev`; for i in `cat Dest_Lun.txt`; do echo $OK$i;done;done
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_un2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1002/rtb-bed-serv1_un2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1003/rtb-bed-serv1_un2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1001/rtb-bed-serv1_un2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_un1002/rtb-bed-serv1_un2002
[vonas@putor tmp]$
0
 

Author Comment

by:luser9999
ID: 39929387
Thanks savone,

We want the output of 5 lines only

/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2002
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_ud2003
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_un2001
/vol/clone_vol_rtb_bed_serv1_data_03_12_2014_00_19/qa_ud1001/rtb-bed-serv1_un2002


since Dest_Lun.txt  file has 5 entries.  Is there any modifications you do for 'for' loop.

thanks for helping
0
 
LVL 20

Accepted Solution

by:
simon3270 earned 1000 total points
ID: 39929393
In a similar way but without the revs (and allowing for different length LUN names):
paste Source_Lun.txt Dest_Lun.txt |while read src dst; do
    sed -i "s/_${src}\$/_${dst}/" CloneLuns.txt
done

Open in new window

This does make some assumptions, such as no spaces in the source and dest names, exactly equal numbers of source and dest names, that none of the source names are subsets of each other (e.g. if you have ud1001 as a source, you don't also have aud1001) and that there is always an underscore before the LUN in CloneLuns.txt.
0
Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 

Author Comment

by:luser9999
ID: 39929882
Thanks simon3270. That worked like a charm.

One final question - how to redirect the output to a file so that CloneLuns.txt contains the original data and modified data will be redirected to Modified-Luns.txt file.

i tried

paste Source_Lun.txt Dest_Lun.txt |while read src dst; do
    sed -i "s/_${src}\$/_${dst}/" CloneLuns.txt > Modified-Luns.txt file
done

but does not seem to be working. I even tried below,

paste Source_Lun.txt Dest_Lun.txt |while read src dst; do sed -i.bak "s/_${src}\$/_${dst}/"  CloneLuns.txt  ; done

both original and .bak files have same data (which is modified/replaced data)

Thanks for your time on this
0
 
LVL 20

Expert Comment

by:simon3270
ID: 39930004
That doesn't work because of the "-i" on the sed command (which sort of edits "in place", so that the original file is overwritten).

The problem is that the file is modified by one LUN at a time, so you need to apply the changes to one file repeatedly (the first edit replaces ud1002 with ud2001, the second replaces ud1002 with ud2002 and so on).  That's also why the .bak version failed - By the time it had done the last replacement (un1002 -> un2002), the .bak file had been overwritten four times with slowly changing replacements.

Easiest would be to copy CloneLuns.txt to Modified-Luns.txt before the loop, then work on Modified-Luns.txt instead:
cp CloneLuns.txt Modified-Luns.txt
paste Source_Lun.txt Dest_Luns.txt |while read src dst; do
    sed -i "s/_${src}\$/_${dst}/" Modified-Luns.txt
done

Open in new window

(edited because I misspelt the ClonedLuns file name!)
0
 
LVL 23

Expert Comment

by:savone
ID: 39930481
@simon3270 - very elegant!  Nice work.
0
 

Author Comment

by:luser9999
ID: 39936123
@simon3270  - thanks :)
0

Featured Post

[Webinar] Database Backup and Recovery

Does your company store data on premises, off site, in the cloud, or a combination of these? If you answered “yes”, you need a data backup recovery plan that fits each and every platform. Watch now as as Percona teaches us how to build agile data backup recovery plan.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

How to remove superseded packages in windows w60 or w61 installation media (.wim) or online system to prevent unnecessary space. w60 means Windows Vista or Windows Server 2008. w61 means Windows 7 or Windows Server 2008 R2. There are various …
This article will show you step-by-step instructions to build your own NTP CentOS server.  The network diagram shows the best practice to setup the NTP server farm for redundancy.  This article also serves as your NTP server documentation.
Learn the basics of while and for loops in Python.  while loops are used for testing while, or until, a condition is met: The structure of a while loop is as follows:     while <condition>:         do something         repeate: The break statement m…
In this fifth video of the Xpdf series, we discuss and demonstrate the PDFdetach utility, which is able to list and, more importantly, extract attachments that are embedded in PDF files. It does this via a command line interface, making it suitable …
Suggested Courses

621 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question