Hi Rick,
Thanks for the suggestion,
I have tried the read command and it still does not work.
The perl version keeps going after the last record in the list and it does
not change anything.
I used the read command in my script (thanks for the idea) and it is much
faster.
As you quite rightly said, the $ sign is seen as a control character but
enclosing the sed command within quotes fixes that.
The main problem was using -e instead of -i in sed, spotted it after looking
at your script.
. My solution was:
cat Mapping/$1-Mapping1 | while read replacestring searchstring
do
if [ $searchstring != $replacestring ];
then
sed -i "s/ $searchstring / $replacestring /g" $2
fi
done
Thus only replacing when required
I would like to get your script working too but it just keeps running after
it hits the last record.
I suspect it has something to do with Windows files (the text files are from
a Windows environment).
Thank you again Rick and Nima.
Regards, Mehmet
> ----- Original Message -----
> Subject: Re: [SLUG] Search and replace question
> From: Rick Welykochy <[email protected]>
> To: "Mehmet Yousouf" <[email protected]>
> Date: 06-03-2010 11:48
>
>
> Mehmet,
>
> Be aware that there are special characters in regular expressions
> as used by grep and sed. $ is special: it matches the end of the line.
> There are others, like ^ [ ] + * etc.
>
> If any of these special chars are in your searchstring, grep will fail
> and sed will fail.
>
>
> Mehmet Yousouf wrote:
>
> > I'm having trouble with the following search and replace script:
> >
> > #!/bin/bash
> > # two parameters are passed in, a mapping file and the text file to
replace
> > in
> >
> > for fields in $(cat ./Mapping/$1-Mapping |awk 'BEGIN{FS=","}{print $2}')
> > do
> > searchstring= $fields
> > replacestring="`grep -w $fields ./Mapping/$1-Mapping |awk
> > 'BEGIN{FS=","}{print $1}'`"
>
> > sed -e "s/$searchstring, / $replacestring, /g" $2>TestResult
> > done
> >
> > it fails if there is a $ sign in the variable $field e.g. amount_$ .
How
> > can I get grep to "behave" the way I want?
>
> One solution:
>
> 1. read in the replace and search strings in one go, which makes the
script
> run faster and avoids the need for grep. bash's read command is fine
for
> this if we set the field separator (IFS) to a comma
>
> 2. use perl to perform the substitution, incorporating the special
characters
> \Q at the beginning of the search string, which tells perl to ignore
the
> special characters I spoke of above.
>
> 3. we use the -i switch in perl to edit the file TestResult in situ and
the -p
> switch to wrap the perl command (after -e) in an input loop followed
by a print
>
> Try this:
>
> #/bin/bash
>
> cp "$2" TestResult
>
> export IFS=','
> cat Mapping/$1-Mapping | while read replace search
> do
> perl -i -p -e "s/\Q$search/$replace/g" TestResult
> done
>
>
>
> cheers
> rickw
>
>
> --
> _________________________________
> Rick Welykochy || Praxis Services
>
> I think there is a world market for about five computers.
> -- Thomas Watson, IBM, 1943
--
SLUG - Sydney Linux User's Group Mailing List - http://slug.org.au/
Subscription info and FAQs: http://slug.org.au/faq/mailinglists.html