Simpler Navigation for Servers and Operating Systems
Completed: a much simpler Servers and Operating Systems section of the Community. We combined many of the older boards, so you won't have to click through so many levels to get at the information you need. Check the consolidated boards here as many sub-forums are now single boards.
Languages and Scripting
cancel
Showing results for 
Search instead for 
Did you mean: 

help me with search & replace string

Highlighted
NDO
Super Advisor

help me with search & replace string

Hi all

Please can you help me with a script to check several files for the following string:

 

encoding=""

 and replace it with:

encoding="UTF-8"

 I did the following, :

#!/bin/sh
string1="encoding="""
string2="encoding="UTF-8"
sed 's/'"$string1"'/'"$string2"'/g'

 but does not work.

Please can you help

FR

13 REPLIES
Steven Schweda
Honored Contributor

Re: help me with search & replace string

 
Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>but does not work.

 

It would help if you could also show the error.  As Steven said, it seems the only problem is in quoting string1 & string2.

You should also remove the quote stuttering in the sed command:

sed "s/$string1/$string2/g"

NDO
Super Advisor

Re: help me with search & replace string (quoting)

Hi

 

It does work now, but only for one file and if I insert the file name after the "sed" command, like:

 

sed  "s/$string1/$string2/g" text2insert.txt > newfile.out

 

But I have 30000 files to modify, and I cannot change the filename.

 

FR

Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>I have 30000 files to modify, and I cannot change the filename.

 

That's what scripting is for.  To handle > 1 cases.

If you have gnu sed or perl there is a -i option for in place update.

Otherwise you need to do something like:

sed  "s/$string1/$string2/g" $file > $file.new

if [ $? -eq 0 ]; then

   mv $file.new $file

fi

NDO
Super Advisor

Re: help me with search & replace string (quoting)

I am still in the learning phases of scripting, sorry if my next question is a dumb one:

I presume I have to declare $file with the path where this xml files are located right?

file="/xxx/www/lll.xml"
file.new="/xxx/www/zzz.xml"
Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>I presume I have to declare $file with the path where this xml files are located right?

 

Yes but not file.new, that's not a variable.

If you want to be pedantic about it:

sed  "s/$string1/$string2/g" ${file} > ${file}.new

NDO
Super Advisor

Re: help me with search & replace string (quoting)

my biggest problem is really to understand the

${file} > ${file}.new

part of the script
Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>my biggest problem is really to understand the ${file} > ${file}.new part of the script

 

${file} needs to take on each of your 30,000 files you need to change.

NDO
Super Advisor

Re: help me with search & replace string (quoting)

 

Hi

 

This is the final script:

#!/bin/sh
file="/tmp/fr/danilo/"
string1="encoding="""
string2="encoding="UTF-8"
sed  "s/$string1/$string2/g" $file > $file.new

if [ $? -eq 0 ]; then

   mv $file.new $file

fi

 And this is the error I am having when I run:

 

mceldev[253]/tmp/fr/danilo #./mudar
./mudar[4]: Syntax error at line 5 : `"' is not matched.
mceldev[254]/tmp/fr/danilo #

 

Can you help

 

FR

Steven Schweda
Honored Contributor

Re: help me with search & replace string (quoting)

 
Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>And this is the error I am having when I run:

 

This is the same error that Steven told you how to fix before and again just now.

 

>file="/tmp/fr/danilo/"

>sed "s/$string1/$string2/g" $file > $file.new

 

Your assignment to "file" above isn't going to work since will be treated as a directory path when adding ".new".

If you do want to scan/change mass quantities, you need to tell us how you find those 30,000 files.

Also, the above code changes the file modification date, even if the string isn't found.  Do you want to not change the dates on those?

 

>If you do get the quotation marks into string1 and string2, what do you think will happen when you add more quotation marks to them, as in: "s/$string1/$string2/g"

 

I'm not sure of your point?  If I got those double quotes into the strings (using single quotes), I had no problems with the sed command.  (At least with bash.  And a real shell works too.)

 

I wasn't sure so I explicitly checked it.  Reading the man page briefly may not provide enough detail to figure out what it does, so experiments are also helpful.

Steven Schweda
Honored Contributor

Re: help me with search & replace string (quoting)

 
Dennis Handly
Acclaimed Contributor

Re: help me with search & replace string (quoting)

>It works for me, too. My usual quotation paranoia must be getting out of control.

 

Yes, I didn't think it would be that easy either.

 

It appears once something is quoted, it doesn't matter what the variables inside expand to.

Or course programs like sed and grep may need even more quoting.  :-)