sed with a variable

Hi,

My shell script searches a VALUE in a file, copies it to a variable and updates a line in another file with this new VALUE (replacing the old)

The value has a pattern-
VALUE=`$$MyDate=11-11-2008 09.09.56.123456`

(yes the $ - . = and space are all part of the string)

I am having prob with sed

Which of the following should work?
a) sed 's/${oldDate}/${newDate}/' file1.txt > temp
b) sed 's/'"${oldDate}"'/'"${newDate}"'/' file1.txt > temp
c) sed "s/${oldDate}/${newDate}/" file1.txt > temp
d) sed "s#${oldDate}#${newDate}#"' file1.txt > temp
e) any other

;)searching all threads i had the above noted as possible solutions but all above options i've tried and none work
is using ${xyz} instead of $xyz the prob?
or i should try again? any 1 out of (a) - (d) must work?
is it something to do with what "shell" i m using?
sorry i'm 3 days old in unix

Thanks!

I'd vote for the modified 'd' (unless there's a '#' embedded in either of the date variables):

sed "s#${oldDate}#${newDate}#" file1.txt > temp

Thanks 4 d quick reply but.. :slight_smile:
sorry i put the wrong format, date doesn't ve a / or # both(I've edited the question)
I did try all 4 options, and If someone is confident that it HAS 2b one of these i'd go try again..
Had the same prob with grep with these variables..
(Can $$ be a prob?)

Your VALUE is using backticks instead of single quote characters.

Could that be the issue?

d really should work unless there was a pound sign in your ${oldDate} or ${newDate} variables.

Some more precise sample code may be helpful here.
-mschwage

BTW, you should be able to answer your question: "Can ?? be a prob?"

Create a file- call it tmpfile- with the contents:

wow$$blah

Now try it:

sed -e 's#$$#foo#' tmpfile

Learn to divide your problems and conquer, and you'll end up less frustrated in the long run.

...However, though you may find that the $ is a problem, that may not help you know the magic UNIX incantation for dealing with it. The proper way to search and replace that $$ is:

sed -e 's#\$\$#foo#' tmpfile

So the way to fix your search is to enter backslash hell, and change all the $'s in your value to \$:

VALUE=`echo $VALUE | sed -e 's#\\$#\\\\$#g'`

...Makes you yearn for Perl, don't it? :cool:

In short, that $ will give you trouble because it's the regular expression construct that means "match at the end of the line". It's also recognized by the shell because it's the metacharacter that says "this thingie is a variable".

After a year or so of dealing with this sort of thing in shell, you probably will add Perl to your toolbox... :frowning: :eek: :rolleyes: :stuck_out_tongue:
-mschwage

Option D was right
I was using sed "s#$var1#$var2#" didn't work
on using sed "s#${var1}#${var2}#" worked
Can someone tell me why?

my var2 never had the char "/" thats why # worked and / didn't, i only checked var1 format (my mistake)

Sorry for not posting in the dummy forum

Thanks a lot already

PS: it'd always be my mistake, how can the shell make mistakes :slight_smile:

In this case, using

s#$var1#$var2#

should work as well as

s#${var1}#${var2}#

. Not sure why yours failed, I guess we'd need to see some more specific examples of your code and variable contents.

BTW, generally using

${var}

is safer than

$var

. Likely you already know this, but ${var} lesses any confustion that may be caused if you're trying to build a string from, say, $var_suffix. In that case, is the name of the variable "var" or "var_suffix"? To the shell, it's "var_suffix". You would have to use the braces to specify the variable "var"- ie, ${var}_suffix.
-mschwager