Improve company productivity with a Business Account.Sign Up

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 273
  • Last Modified:

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

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
luser9999
Asked:
luser9999
  • 3
  • 2
  • 2
2 Solutions
 
savoneCommented:
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
 
luser9999Author Commented:
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
 
simon3270Commented:
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
Free Tool: Port Scanner

Check which ports are open to the outside world. Helps make sure that your firewall rules are working as intended.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

 
luser9999Author Commented:
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
 
simon3270Commented:
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
 
savoneCommented:
@simon3270 - very elegant!  Nice work.
0
 
luser9999Author Commented:
@simon3270  - thanks :)
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Get expert help—faster!

Need expert help—fast? Use the Help Bell for personalized assistance getting answers to your important questions.

  • 3
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now